blob: 7080c65f34b210ee656521d8e486bfd8a7334e57 [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);
226 case Compare_kind:
227 if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
228 PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
229 return 0;
230 }
231 if (asdl_seq_LEN(exp->v.Compare.comparators) !=
232 asdl_seq_LEN(exp->v.Compare.ops)) {
233 PyErr_SetString(PyExc_ValueError, "Compare has a different number "
234 "of comparators and operands");
235 return 0;
236 }
237 return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
238 validate_expr(exp->v.Compare.left, Load);
239 case Call_kind:
240 return validate_expr(exp->v.Call.func, Load) &&
241 validate_exprs(exp->v.Call.args, Load, 0) &&
242 validate_keywords(exp->v.Call.keywords) &&
243 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
244 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
245 case Num_kind: {
246 PyObject *n = exp->v.Num.n;
247 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
248 !PyComplex_CheckExact(n)) {
249 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
250 return 0;
251 }
252 return 1;
253 }
254 case Str_kind: {
255 PyObject *s = exp->v.Str.s;
256 if (!PyUnicode_CheckExact(s)) {
257 PyErr_SetString(PyExc_TypeError, "non-string type in Str");
258 return 0;
259 }
260 return 1;
261 }
262 case Bytes_kind: {
263 PyObject *b = exp->v.Bytes.s;
264 if (!PyBytes_CheckExact(b)) {
265 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
266 return 0;
267 }
268 return 1;
269 }
270 case Attribute_kind:
271 return validate_expr(exp->v.Attribute.value, Load);
272 case Subscript_kind:
273 return validate_slice(exp->v.Subscript.slice) &&
274 validate_expr(exp->v.Subscript.value, Load);
275 case Starred_kind:
276 return validate_expr(exp->v.Starred.value, ctx);
277 case List_kind:
278 return validate_exprs(exp->v.List.elts, ctx, 0);
279 case Tuple_kind:
280 return validate_exprs(exp->v.Tuple.elts, ctx, 0);
281 /* These last cases don't have any checking. */
282 case Name_kind:
283 case Ellipsis_kind:
284 return 1;
285 default:
286 PyErr_SetString(PyExc_SystemError, "unexpected expression");
287 return 0;
288 }
289}
290
291static int
292validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
293{
294 if (asdl_seq_LEN(seq))
295 return 1;
296 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
297 return 0;
298}
299
300static int
301validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
302{
303 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
304 validate_exprs(targets, ctx, 0);
305}
306
307static int
308validate_body(asdl_seq *body, const char *owner)
309{
310 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
311}
312
313static int
314validate_stmt(stmt_ty stmt)
315{
316 int i;
317 switch (stmt->kind) {
318 case FunctionDef_kind:
319 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
320 validate_arguments(stmt->v.FunctionDef.args) &&
321 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
322 (!stmt->v.FunctionDef.returns ||
323 validate_expr(stmt->v.FunctionDef.returns, Load));
324 case ClassDef_kind:
325 return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
326 validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
327 validate_keywords(stmt->v.ClassDef.keywords) &&
328 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
329 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
330 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
331 case Return_kind:
332 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
333 case Delete_kind:
334 return validate_assignlist(stmt->v.Delete.targets, Del);
335 case Assign_kind:
336 return validate_assignlist(stmt->v.Assign.targets, Store) &&
337 validate_expr(stmt->v.Assign.value, Load);
338 case AugAssign_kind:
339 return validate_expr(stmt->v.AugAssign.target, Store) &&
340 validate_expr(stmt->v.AugAssign.value, Load);
341 case For_kind:
342 return validate_expr(stmt->v.For.target, Store) &&
343 validate_expr(stmt->v.For.iter, Load) &&
344 validate_body(stmt->v.For.body, "For") &&
345 validate_stmts(stmt->v.For.orelse);
346 case While_kind:
347 return validate_expr(stmt->v.While.test, Load) &&
348 validate_body(stmt->v.While.body, "While") &&
349 validate_stmts(stmt->v.While.orelse);
350 case If_kind:
351 return validate_expr(stmt->v.If.test, Load) &&
352 validate_body(stmt->v.If.body, "If") &&
353 validate_stmts(stmt->v.If.orelse);
354 case With_kind:
355 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
356 return 0;
357 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
358 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
359 if (!validate_expr(item->context_expr, Load) ||
360 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
361 return 0;
362 }
363 return validate_body(stmt->v.With.body, "With");
364 case Raise_kind:
365 if (stmt->v.Raise.exc) {
366 return validate_expr(stmt->v.Raise.exc, Load) &&
367 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
368 }
369 if (stmt->v.Raise.cause) {
370 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
371 return 0;
372 }
373 return 1;
374 case Try_kind:
375 if (!validate_body(stmt->v.Try.body, "Try"))
376 return 0;
377 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
378 !asdl_seq_LEN(stmt->v.Try.finalbody)) {
379 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
380 return 0;
381 }
382 if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
383 asdl_seq_LEN(stmt->v.Try.orelse)) {
384 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
385 return 0;
386 }
387 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
388 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
389 if ((handler->v.ExceptHandler.type &&
390 !validate_expr(handler->v.ExceptHandler.type, Load)) ||
391 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
392 return 0;
393 }
394 return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
395 validate_stmts(stmt->v.Try.finalbody)) &&
396 (!asdl_seq_LEN(stmt->v.Try.orelse) ||
397 validate_stmts(stmt->v.Try.orelse));
398 case Assert_kind:
399 return validate_expr(stmt->v.Assert.test, Load) &&
400 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
401 case Import_kind:
402 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
403 case ImportFrom_kind:
404 if (stmt->v.ImportFrom.level < -1) {
405 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
406 return 0;
407 }
408 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
409 case Global_kind:
410 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
411 case Nonlocal_kind:
412 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
413 case Expr_kind:
414 return validate_expr(stmt->v.Expr.value, Load);
415 case Pass_kind:
416 case Break_kind:
417 case Continue_kind:
418 return 1;
419 default:
420 PyErr_SetString(PyExc_SystemError, "unexpected statement");
421 return 0;
422 }
423}
424
425static int
426validate_stmts(asdl_seq *seq)
427{
428 int i;
429 for (i = 0; i < asdl_seq_LEN(seq); i++) {
430 stmt_ty stmt = asdl_seq_GET(seq, i);
431 if (stmt) {
432 if (!validate_stmt(stmt))
433 return 0;
434 }
435 else {
436 PyErr_SetString(PyExc_ValueError,
437 "None disallowed in statement list");
438 return 0;
439 }
440 }
441 return 1;
442}
443
444static int
445validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
446{
447 int i;
448 for (i = 0; i < asdl_seq_LEN(exprs); i++) {
449 expr_ty expr = asdl_seq_GET(exprs, i);
450 if (expr) {
451 if (!validate_expr(expr, ctx))
452 return 0;
453 }
454 else if (!null_ok) {
455 PyErr_SetString(PyExc_ValueError,
456 "None disallowed in expression list");
457 return 0;
458 }
459
460 }
461 return 1;
462}
463
464int
465PyAST_Validate(mod_ty mod)
466{
467 int res = 0;
468
469 switch (mod->kind) {
470 case Module_kind:
471 res = validate_stmts(mod->v.Module.body);
472 break;
473 case Interactive_kind:
474 res = validate_stmts(mod->v.Interactive.body);
475 break;
476 case Expression_kind:
477 res = validate_expr(mod->v.Expression.body, Load);
478 break;
479 case Suite_kind:
480 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
481 break;
482 default:
483 PyErr_SetString(PyExc_SystemError, "impossible module node");
484 res = 0;
485 break;
486 }
487 return res;
488}
489
490/* This is down here, so defines like "test" don't intefere with access AST above. */
491#include "grammar.h"
492#include "parsetok.h"
493#include "graminit.h"
494
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495/* Data structure used internally */
496struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000497 char *c_encoding; /* source encoding */
498 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000499 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500};
501
502static asdl_seq *seq_for_testlist(struct compiling *, const node *);
503static expr_ty ast_for_expr(struct compiling *, const node *);
504static stmt_ty ast_for_stmt(struct compiling *, const node *);
505static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
507 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000508static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000509static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510
511/* Note different signature for ast_for_call */
512static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
513
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +0000515static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +0000516static PyObject *parsestrplus(struct compiling *, const node *n,
517 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000518
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +0000520#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521#endif
522
Nick Coghlan650f0d02007-04-15 12:05:43 +0000523#define COMP_GENEXP 0
524#define COMP_LISTCOMP 1
525#define COMP_SETCOMP 2
526
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000527static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +0000528new_identifier(const char* n, PyArena *arena)
529{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200530 _Py_IDENTIFIER(normalize);
Martin v. Löwis5b222132007-06-10 09:51:05 +0000531 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200532 if (!id || PyUnicode_READY(id) == -1)
Benjamin Peterson30760062008-11-25 04:02:28 +0000533 return NULL;
Martin v. Löwis47383402007-08-15 07:32:56 +0000534 /* Check whether there are non-ASCII characters in the
535 identifier; if so, normalize to NFKC. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200536 if (PyUnicode_MAX_CHAR_VALUE((PyUnicodeObject *)id) >= 128) {
537 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
538 PyObject *id2;
539 if (!m)
540 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200541 id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200542 Py_DECREF(m);
543 if (!id2)
544 return NULL;
545 Py_DECREF(id);
546 id = id2;
Martin v. Löwis47383402007-08-15 07:32:56 +0000547 }
Martin v. Löwis5b222132007-06-10 09:51:05 +0000548 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000549 PyArena_AddPyObject(arena, id);
550 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551}
552
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000553#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554
555/* This routine provides an invalid object for the syntax error.
556 The outermost routine must unpack this error and create the
557 proper object. We do this so that we don't have to pass
558 the filename to everything function.
559
560 XXX Maybe we should just pass the filename...
561*/
562
563static int
564ast_error(const node *n, const char *errstr)
565{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000566 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 PyErr_SetObject(PyExc_SyntaxError, u);
570 Py_DECREF(u);
571 return 0;
572}
573
574static void
575ast_error_finish(const char *filename)
576{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000577 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000578 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000579 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580
581 assert(PyErr_Occurred());
582 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584
585 PyErr_Fetch(&type, &value, &tback);
586 errstr = PyTuple_GetItem(value, 0);
587 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000588 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000590 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000591 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000592 Py_DECREF(errstr);
593 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000594 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000595 offset = PyTuple_GetItem(value, 2);
596 if (!offset) {
597 Py_DECREF(errstr);
598 return;
599 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 Py_DECREF(value);
601
602 loc = PyErr_ProgramText(filename, lineno);
603 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000604 Py_INCREF(Py_None);
605 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000607 if (filename != NULL)
608 filename_obj = PyUnicode_DecodeFSDefault(filename);
609 else {
610 Py_INCREF(Py_None);
611 filename_obj = Py_None;
612 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000613 if (filename_obj != NULL)
614 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
615 else
616 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000618 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000619 Py_DECREF(errstr);
620 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000621 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000622 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623 Py_DECREF(errstr);
624 Py_DECREF(tmp);
625 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000626 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 PyErr_Restore(type, value, tback);
628}
629
630/* num_stmts() returns number of contained statements.
631
632 Use this routine to determine how big a sequence is needed for
633 the statements in a parse tree. Its raison d'etre is this bit of
634 grammar:
635
636 stmt: simple_stmt | compound_stmt
637 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
638
639 A simple_stmt can contain multiple small_stmt elements joined
640 by semicolons. If the arg is a simple_stmt, the number of
641 small_stmt elements is returned.
642*/
643
644static int
645num_stmts(const node *n)
646{
647 int i, l;
648 node *ch;
649
650 switch (TYPE(n)) {
651 case single_input:
652 if (TYPE(CHILD(n, 0)) == NEWLINE)
653 return 0;
654 else
655 return num_stmts(CHILD(n, 0));
656 case file_input:
657 l = 0;
658 for (i = 0; i < NCH(n); i++) {
659 ch = CHILD(n, i);
660 if (TYPE(ch) == stmt)
661 l += num_stmts(ch);
662 }
663 return l;
664 case stmt:
665 return num_stmts(CHILD(n, 0));
666 case compound_stmt:
667 return 1;
668 case simple_stmt:
669 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
670 case suite:
671 if (NCH(n) == 1)
672 return num_stmts(CHILD(n, 0));
673 else {
674 l = 0;
675 for (i = 2; i < (NCH(n) - 1); i++)
676 l += num_stmts(CHILD(n, i));
677 return l;
678 }
679 default: {
680 char buf[128];
681
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000682 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 TYPE(n), NCH(n));
684 Py_FatalError(buf);
685 }
686 }
687 assert(0);
688 return 0;
689}
690
691/* Transform the CST rooted at node * to the appropriate AST
692*/
693
694mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000695PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
696 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000697{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000698 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000699 asdl_seq *stmts = NULL;
700 stmt_ty s;
701 node *ch;
702 struct compiling c;
703
704 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000705 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000706 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000707#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000708 ast_error(n, "encoding declaration in Unicode string");
709 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000710#endif
711 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000712 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 } else if (TYPE(n) == encoding_decl) {
714 c.c_encoding = STR(n);
715 n = CHILD(n, 0);
716 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000718 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000720 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000721 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722
Jeremy Hyltona8293132006-02-28 17:58:27 +0000723 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724 switch (TYPE(n)) {
725 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000726 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 for (i = 0; i < NCH(n) - 1; i++) {
730 ch = CHILD(n, i);
731 if (TYPE(ch) == NEWLINE)
732 continue;
733 REQ(ch, stmt);
734 num = num_stmts(ch);
735 if (num == 1) {
736 s = ast_for_stmt(&c, ch);
737 if (!s)
738 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000739 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 }
741 else {
742 ch = CHILD(ch, 0);
743 REQ(ch, simple_stmt);
744 for (j = 0; j < num; j++) {
745 s = ast_for_stmt(&c, CHILD(ch, j * 2));
746 if (!s)
747 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000748 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749 }
750 }
751 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000752 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 case eval_input: {
754 expr_ty testlist_ast;
755
Nick Coghlan650f0d02007-04-15 12:05:43 +0000756 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000757 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 if (!testlist_ast)
759 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000760 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761 }
762 case single_input:
763 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000764 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000766 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000767 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
768 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000769 if (!asdl_seq_GET(stmts, 0))
770 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 }
773 else {
774 n = CHILD(n, 0);
775 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000776 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000778 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000780 s = ast_for_stmt(&c, n);
781 if (!s)
782 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783 asdl_seq_SET(stmts, 0, s);
784 }
785 else {
786 /* Only a simple_stmt can contain multiple statements. */
787 REQ(n, simple_stmt);
788 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 if (TYPE(CHILD(n, i)) == NEWLINE)
790 break;
791 s = ast_for_stmt(&c, CHILD(n, i));
792 if (!s)
793 goto error;
794 asdl_seq_SET(stmts, i / 2, s);
795 }
796 }
797
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000798 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799 }
800 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000801 PyErr_Format(PyExc_SystemError,
802 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 goto error;
804 }
805 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 ast_error_finish(filename);
807 return NULL;
808}
809
810/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
811*/
812
813static operator_ty
814get_operator(const node *n)
815{
816 switch (TYPE(n)) {
817 case VBAR:
818 return BitOr;
819 case CIRCUMFLEX:
820 return BitXor;
821 case AMPER:
822 return BitAnd;
823 case LEFTSHIFT:
824 return LShift;
825 case RIGHTSHIFT:
826 return RShift;
827 case PLUS:
828 return Add;
829 case MINUS:
830 return Sub;
831 case STAR:
832 return Mult;
833 case SLASH:
834 return Div;
835 case DOUBLESLASH:
836 return FloorDiv;
837 case PERCENT:
838 return Mod;
839 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000840 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841 }
842}
843
Guido van Rossume7ba4952007-06-06 23:52:48 +0000844static const char* FORBIDDEN[] = {
845 "None",
846 "True",
847 "False",
848 NULL,
849};
850
851static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000852forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000853{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000854 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000855 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
856 ast_error(n, "assignment to keyword");
857 return 1;
858 }
859 if (full_checks) {
860 const char **p;
861 for (p = FORBIDDEN; *p; p++) {
862 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
863 ast_error(n, "assignment to keyword");
864 return 1;
865 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000866 }
867 }
868 return 0;
869}
870
Jeremy Hyltona8293132006-02-28 17:58:27 +0000871/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872
873 Only sets context for expr kinds that "can appear in assignment context"
874 (according to ../Parser/Python.asdl). For other expr kinds, it sets
875 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876*/
877
878static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000879set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880{
881 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000882 /* If a particular expression type can't be used for assign / delete,
883 set expr_name to its name and an error message will be generated.
884 */
885 const char* expr_name = NULL;
886
887 /* The ast defines augmented store and load contexts, but the
888 implementation here doesn't actually use them. The code may be
889 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000891 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000892 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000893 */
894 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
896 switch (e->kind) {
897 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000899 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
900 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000901 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000903 e->v.Subscript.ctx = ctx;
904 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000905 case Starred_kind:
906 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000907 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000908 return 0;
909 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000911 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000912 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000913 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000914 }
915 e->v.Name.ctx = ctx;
916 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 e->v.List.ctx = ctx;
919 s = e->v.List.elts;
920 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000922 if (asdl_seq_LEN(e->v.Tuple.elts)) {
923 e->v.Tuple.ctx = ctx;
924 s = e->v.Tuple.elts;
925 }
926 else {
927 expr_name = "()";
928 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000930 case Lambda_kind:
931 expr_name = "lambda";
932 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000936 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000938 case UnaryOp_kind:
939 expr_name = "operator";
940 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000942 expr_name = "generator expression";
943 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000944 case Yield_kind:
945 expr_name = "yield expression";
946 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000947 case ListComp_kind:
948 expr_name = "list comprehension";
949 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000950 case SetComp_kind:
951 expr_name = "set comprehension";
952 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000953 case DictComp_kind:
954 expr_name = "dict comprehension";
955 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000956 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000957 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 case Num_kind:
959 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500960 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000961 expr_name = "literal";
962 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000963 case Ellipsis_kind:
964 expr_name = "Ellipsis";
965 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000966 case Compare_kind:
967 expr_name = "comparison";
968 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969 case IfExp_kind:
970 expr_name = "conditional expression";
971 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000972 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyErr_Format(PyExc_SystemError,
974 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 e->kind, e->lineno);
976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000978 /* Check for error string set by switch */
979 if (expr_name) {
980 char buf[300];
981 PyOS_snprintf(buf, sizeof(buf),
982 "can't %s %s",
983 ctx == Store ? "assign to" : "delete",
984 expr_name);
985 return ast_error(n, buf);
986 }
987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 */
991 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000995 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000996 return 0;
997 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 }
999 return 1;
1000}
1001
1002static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001003ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004{
1005 REQ(n, augassign);
1006 n = CHILD(n, 0);
1007 switch (STR(n)[0]) {
1008 case '+':
1009 return Add;
1010 case '-':
1011 return Sub;
1012 case '/':
1013 if (STR(n)[1] == '/')
1014 return FloorDiv;
1015 else
1016 return Div;
1017 case '%':
1018 return Mod;
1019 case '<':
1020 return LShift;
1021 case '>':
1022 return RShift;
1023 case '&':
1024 return BitAnd;
1025 case '^':
1026 return BitXor;
1027 case '|':
1028 return BitOr;
1029 case '*':
1030 if (STR(n)[1] == '*')
1031 return Pow;
1032 else
1033 return Mult;
1034 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001035 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001036 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037 }
1038}
1039
1040static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001041ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042{
Guido van Rossumb053cd82006-08-24 03:53:23 +00001043 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 |'is' 'not'
1045 */
1046 REQ(n, comp_op);
1047 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001048 n = CHILD(n, 0);
1049 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 case LESS:
1051 return Lt;
1052 case GREATER:
1053 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001054 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055 return Eq;
1056 case LESSEQUAL:
1057 return LtE;
1058 case GREATEREQUAL:
1059 return GtE;
1060 case NOTEQUAL:
1061 return NotEq;
1062 case NAME:
1063 if (strcmp(STR(n), "in") == 0)
1064 return In;
1065 if (strcmp(STR(n), "is") == 0)
1066 return Is;
1067 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001068 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 /* handle "not in" and "is not" */
1075 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076 case NAME:
1077 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
1078 return NotIn;
1079 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
1080 return IsNot;
1081 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001082 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001084 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001085 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086 }
Neal Norwitz79792652005-11-14 04:25:03 +00001087 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090}
1091
1092static asdl_seq *
1093seq_for_testlist(struct compiling *c, const node *n)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +00001096 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
1097 */
Armin Rigo31441302005-10-21 12:57:31 +00001098 asdl_seq *seq;
1099 expr_ty expression;
1100 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +00001101 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001103 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 if (!seq)
1105 return NULL;
1106
1107 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +00001109 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Benjamin Peterson4905e802009-09-27 02:43:28 +00001111 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001112 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114
1115 assert(i / 2 < seq->size);
1116 asdl_seq_SET(seq, i / 2, expression);
1117 }
1118 return seq;
1119}
1120
Neal Norwitzc1505362006-12-28 06:47:50 +00001121static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001122compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +00001123{
1124 identifier name;
1125 expr_ty annotation = NULL;
1126 node *ch;
1127
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001128 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001129 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +00001130 name = NEW_IDENTIFIER(ch);
1131 if (!name)
1132 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001133 if (forbidden_name(name, ch, 0))
1134 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001135
1136 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
1137 annotation = ast_for_expr(c, CHILD(n, 2));
1138 if (!annotation)
1139 return NULL;
1140 }
1141
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001142 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001143#if 0
1144 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
1145 if (!set_context(c, result, Store, n))
1146 return NULL;
1147 return result;
1148#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149}
1150
Guido van Rossum4f72a782006-10-27 23:31:49 +00001151/* returns -1 if failed to handle keyword only arguments
1152 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001153 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +00001154 ^^^
1155 start pointing here
1156 */
1157static int
1158handle_keywordonly_args(struct compiling *c, const node *n, int start,
1159 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
1160{
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001161 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001162 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +00001163 expr_ty expression, annotation;
1164 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001165 int i = start;
1166 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001167
1168 if (kwonlyargs == NULL) {
1169 ast_error(CHILD(n, start), "named arguments must follow bare *");
1170 return -1;
1171 }
1172 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001173 while (i < NCH(n)) {
1174 ch = CHILD(n, i);
1175 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001176 case vfpdef:
1177 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001178 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001179 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001180 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001181 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001182 asdl_seq_SET(kwdefaults, j, expression);
1183 i += 2; /* '=' and test */
1184 }
1185 else { /* setting NULL if no default value exists */
1186 asdl_seq_SET(kwdefaults, j, NULL);
1187 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001188 if (NCH(ch) == 3) {
1189 /* ch is NAME ':' test */
1190 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001191 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +00001192 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001193 }
1194 else {
1195 annotation = NULL;
1196 }
1197 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001198 argname = NEW_IDENTIFIER(ch);
1199 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001200 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001201 if (forbidden_name(argname, ch, 0))
1202 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00001203 arg = arg(argname, annotation, c->c_arena);
1204 if (!arg)
1205 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001206 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001207 i += 2; /* the name and the comma */
1208 break;
1209 case DOUBLESTAR:
1210 return i;
1211 default:
1212 ast_error(ch, "unexpected node");
1213 goto error;
1214 }
1215 }
1216 return i;
1217 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001219}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220
Jeremy Hyltona8293132006-02-28 17:58:27 +00001221/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222
1223static arguments_ty
1224ast_for_arguments(struct compiling *c, const node *n)
1225{
Neal Norwitzc1505362006-12-28 06:47:50 +00001226 /* This function handles both typedargslist (function definition)
1227 and varargslist (lambda definition).
1228
1229 parameters: '(' [typedargslist] ')'
1230 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001232 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001233 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001234 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +00001235 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001237 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +00001238 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001239 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 */
Guido van Rossum4f72a782006-10-27 23:31:49 +00001241 int i, j, k, nposargs = 0, nkwonlyargs = 0;
1242 int nposdefaults = 0, found_default = 0;
1243 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001245 arg_ty arg;
1246 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 node *ch;
1248
1249 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001250 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +00001251 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1252 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001253 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001255 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256
Jeremy Hyltone921e022008-07-17 16:37:17 +00001257 /* First count the number of positional args & defaults. The
1258 variable i is the loop index for this for loop and the next.
1259 The next loop picks up where the first leaves off.
1260 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001262 ch = CHILD(n, i);
1263 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +00001264 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001265 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +00001266 if (i < NCH(n) && /* skip argument following star */
1267 (TYPE(CHILD(n, i)) == tfpdef ||
1268 TYPE(CHILD(n, i)) == vfpdef)) {
1269 i++;
1270 }
1271 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001272 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001273 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +00001274 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001275 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +00001278 defaults for keyword only args */
1279 for ( ; i < NCH(n); ++i) {
1280 ch = CHILD(n, i);
1281 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001282 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001283 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001284 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
1285 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001286 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001287 kwonlyargs = (nkwonlyargs ?
1288 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1289 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001290 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001292 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
1293 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001294 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +00001296 since we set NULL as default for keyword only argument w/o default
1297 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +00001298 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +00001299 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
1300 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001301 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001302
1303 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001304 ast_error(n, "more than 255 arguments");
1305 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001306 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001308 /* tfpdef: NAME [':' test]
1309 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310 */
1311 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001312 j = 0; /* index for defaults */
1313 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001315 ch = CHILD(n, i);
1316 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001317 case tfpdef:
1318 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
1320 anything other than EQUAL or a comma? */
1321 /* XXX Should NCH(n) check be made a separate check? */
1322 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001323 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
1324 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001325 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001326 assert(posdefaults != NULL);
1327 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001329 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001331 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +00001333 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001334 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001335 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001336 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +00001337 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001338 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001339 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 i += 2; /* the name and the comma */
1341 break;
1342 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +00001343 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +00001345 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001346 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001347 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001348 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +00001349 if (TYPE(ch) == COMMA) {
1350 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001351 i += 2; /* now follows keyword only arguments */
1352 res = handle_keywordonly_args(c, n, i,
1353 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001354 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001355 i = res; /* res has new position to process */
1356 }
1357 else {
Neal Norwitzc1505362006-12-28 06:47:50 +00001358 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +00001359 if (!vararg)
1360 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001361 if (forbidden_name(vararg, CHILD(ch, 0), 0))
1362 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001363 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001364 /* there is an annotation on the vararg */
1365 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001366 if (!varargannotation)
1367 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00001369 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001370 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
1371 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +00001372 int res = 0;
1373 res = handle_keywordonly_args(c, n, i,
1374 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001375 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001376 i = res; /* res has new position to process */
1377 }
1378 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 break;
1380 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +00001381 ch = CHILD(n, i+1); /* tfpdef */
1382 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +00001383 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +00001384 if (!kwarg)
1385 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001386 if (NCH(ch) > 1) {
1387 /* there is an annotation on the kwarg */
1388 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001389 if (!kwargannotation)
1390 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001391 }
Benjamin Peterson70f52762009-06-28 23:32:44 +00001392 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001393 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 i += 3;
1395 break;
1396 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001397 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 "unexpected node in varargslist: %d @ %d",
1399 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001400 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001401 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001403 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
1404 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405}
1406
1407static expr_ty
1408ast_for_dotted_name(struct compiling *c, const node *n)
1409{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001410 expr_ty e;
1411 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001412 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413 int i;
1414
1415 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001416
1417 lineno = LINENO(n);
1418 col_offset = n->n_col_offset;
1419
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 id = NEW_IDENTIFIER(CHILD(n, 0));
1421 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001422 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001423 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426
1427 for (i = 2; i < NCH(n); i+=2) {
1428 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001429 if (!id)
1430 return NULL;
1431 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
1432 if (!e)
1433 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 }
1435
1436 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437}
1438
1439static expr_ty
1440ast_for_decorator(struct compiling *c, const node *n)
1441{
1442 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
1443 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001444 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001447 REQ(CHILD(n, 0), AT);
1448 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
1451 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001455 d = name_expr;
1456 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
1458 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001460 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001461 if (!d)
1462 return NULL;
1463 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 }
1465 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001466 d = ast_for_call(c, CHILD(n, 3), name_expr);
1467 if (!d)
1468 return NULL;
1469 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470 }
1471
1472 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473}
1474
1475static asdl_seq*
1476ast_for_decorators(struct compiling *c, const node *n)
1477{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001478 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001479 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001483 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 if (!decorator_seq)
1485 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001488 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001489 if (!d)
1490 return NULL;
1491 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 }
1493 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494}
1495
1496static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001497ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001499 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001500 identifier name;
1501 arguments_ty args;
1502 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001503 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001504 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505
1506 REQ(n, funcdef);
1507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 name = NEW_IDENTIFIER(CHILD(n, name_i));
1509 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001511 if (forbidden_name(name, CHILD(n, name_i), 0))
1512 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1514 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001516 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1517 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1518 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001519 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001520 name_i += 2;
1521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 body = ast_for_suite(c, CHILD(n, name_i + 3));
1523 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Neal Norwitzc1505362006-12-28 06:47:50 +00001526 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001527 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528}
1529
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001530static stmt_ty
1531ast_for_decorated(struct compiling *c, const node *n)
1532{
1533 /* decorated: decorators (classdef | funcdef) */
1534 stmt_ty thing = NULL;
1535 asdl_seq *decorator_seq = NULL;
1536
1537 REQ(n, decorated);
1538
1539 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1540 if (!decorator_seq)
1541 return NULL;
1542
1543 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001545
1546 if (TYPE(CHILD(n, 1)) == funcdef) {
1547 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1548 } else if (TYPE(CHILD(n, 1)) == classdef) {
1549 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1550 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001551 /* we count the decorators in when talking about the class' or
1552 * function's line number */
1553 if (thing) {
1554 thing->lineno = LINENO(n);
1555 thing->col_offset = n->n_col_offset;
1556 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001557 return thing;
1558}
1559
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560static expr_ty
1561ast_for_lambdef(struct compiling *c, const node *n)
1562{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001563 /* lambdef: 'lambda' [varargslist] ':' test
1564 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565 arguments_ty args;
1566 expr_ty expression;
1567
1568 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001569 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1570 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571 if (!args)
1572 return NULL;
1573 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001574 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 }
1577 else {
1578 args = ast_for_arguments(c, CHILD(n, 1));
1579 if (!args)
1580 return NULL;
1581 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001582 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584 }
1585
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001586 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587}
1588
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001589static expr_ty
1590ast_for_ifexpr(struct compiling *c, const node *n)
1591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001593 expr_ty expression, body, orelse;
1594
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001595 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001596 body = ast_for_expr(c, CHILD(n, 0));
1597 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001598 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001599 expression = ast_for_expr(c, CHILD(n, 2));
1600 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001601 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001602 orelse = ast_for_expr(c, CHILD(n, 4));
1603 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001604 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001605 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1606 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001607}
1608
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001609/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001610 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001611
Nick Coghlan650f0d02007-04-15 12:05:43 +00001612 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613*/
1614
1615static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001616count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619
Guido van Rossumd8faa362007-04-27 19:54:29 +00001620 count_comp_for:
1621 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001622 REQ(n, comp_for);
1623 if (NCH(n) == 5)
1624 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001625 else
1626 return n_fors;
1627 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001628 REQ(n, comp_iter);
1629 n = CHILD(n, 0);
1630 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001631 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001632 else if (TYPE(n) == comp_if) {
1633 if (NCH(n) == 3) {
1634 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001635 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001636 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001637 else
1638 return n_fors;
1639 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001640
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 /* Should never be reached */
1642 PyErr_SetString(PyExc_SystemError,
1643 "logic error in count_comp_fors");
1644 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645}
1646
Nick Coghlan650f0d02007-04-15 12:05:43 +00001647/* Count the number of 'if' statements 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_ifs(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_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001656
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657 while (1) {
1658 REQ(n, comp_iter);
1659 if (TYPE(CHILD(n, 0)) == comp_for)
1660 return n_ifs;
1661 n = CHILD(n, 0);
1662 REQ(n, comp_if);
1663 n_ifs++;
1664 if (NCH(n) == 2)
1665 return n_ifs;
1666 n = CHILD(n, 2);
1667 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001668}
1669
Guido van Rossum992d4a32007-07-11 13:09:30 +00001670static asdl_seq *
1671ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001672{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001674 asdl_seq *comps;
1675
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001676 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 if (n_fors == -1)
1678 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001679
Nick Coghlan650f0d02007-04-15 12:05:43 +00001680 comps = asdl_seq_new(n_fors, c->c_arena);
1681 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001683
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001684 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001685 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001687 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001688 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689
Guido van Rossum992d4a32007-07-11 13:09:30 +00001690 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691
Guido van Rossum992d4a32007-07-11 13:09:30 +00001692 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001693 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001694 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001696 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001697 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001699
Thomas Wouters89f507f2006-12-13 04:49:30 +00001700 /* Check the # of children rather than the length of t, since
1701 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001702 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001703 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001704 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001706 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1707 c->c_arena),
1708 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001709 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001711
Guido van Rossum992d4a32007-07-11 13:09:30 +00001712 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 int j, n_ifs;
1714 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715
Guido van Rossum992d4a32007-07-11 13:09:30 +00001716 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001717 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001719 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001720
1721 ifs = asdl_seq_new(n_ifs, c->c_arena);
1722 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001724
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001726 REQ(n, comp_iter);
1727 n = CHILD(n, 0);
1728 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729
Guido van Rossum992d4a32007-07-11 13:09:30 +00001730 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001732 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001733 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001734 if (NCH(n) == 3)
1735 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001737 /* on exit, must guarantee that n is a comp_for */
1738 if (TYPE(n) == comp_iter)
1739 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001740 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001742 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001744 return comps;
1745}
1746
1747static expr_ty
1748ast_for_itercomp(struct compiling *c, const node *n, int type)
1749{
1750 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1751 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1752 expr_ty elt;
1753 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754
Guido van Rossum992d4a32007-07-11 13:09:30 +00001755 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756
Guido van Rossum992d4a32007-07-11 13:09:30 +00001757 elt = ast_for_expr(c, CHILD(n, 0));
1758 if (!elt)
1759 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760
Guido van Rossum992d4a32007-07-11 13:09:30 +00001761 comps = ast_for_comprehension(c, CHILD(n, 1));
1762 if (!comps)
1763 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001764
1765 if (type == COMP_GENEXP)
1766 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1767 else if (type == COMP_LISTCOMP)
1768 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1769 else if (type == COMP_SETCOMP)
1770 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1771 else
1772 /* Should never happen */
1773 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774}
1775
1776static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001777ast_for_dictcomp(struct compiling *c, const node *n)
1778{
1779 expr_ty key, value;
1780 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781
Guido van Rossum992d4a32007-07-11 13:09:30 +00001782 assert(NCH(n) > 3);
1783 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784
Guido van Rossum992d4a32007-07-11 13:09:30 +00001785 key = ast_for_expr(c, CHILD(n, 0));
1786 if (!key)
1787 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001788 value = ast_for_expr(c, CHILD(n, 2));
1789 if (!value)
1790 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791
Guido van Rossum992d4a32007-07-11 13:09:30 +00001792 comps = ast_for_comprehension(c, CHILD(n, 3));
1793 if (!comps)
1794 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795
Guido van Rossum992d4a32007-07-11 13:09:30 +00001796 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1797}
1798
1799static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800ast_for_genexp(struct compiling *c, const node *n)
1801{
1802 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001803 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001804}
1805
1806static expr_ty
1807ast_for_listcomp(struct compiling *c, const node *n)
1808{
1809 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001810 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001811}
1812
1813static expr_ty
1814ast_for_setcomp(struct compiling *c, const node *n)
1815{
1816 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001817 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001818}
1819
1820
1821static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822ast_for_atom(struct compiling *c, const node *n)
1823{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001824 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1825 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001826 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 */
1828 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001829 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001832 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 /* All names start in Load context, but may later be
1834 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001835 PyObject *name = NEW_IDENTIFIER(ch);
1836 if (!name)
1837 return NULL;
1838 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001841 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001842 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001843 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001844 PyObject *type, *value, *tback, *errstr;
1845 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001846 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001847 if (errstr) {
1848 char *s = "";
1849 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001850 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001851 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1852 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001853 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001854 } else {
1855 ast_error(n, "(unicode error) unknown error");
1856 }
1857 Py_DECREF(type);
1858 Py_DECREF(value);
1859 Py_XDECREF(tback);
1860 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001862 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001863 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001864 if (bytesmode)
1865 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1866 else
1867 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 }
1869 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001870 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001871 if (!pynum)
1872 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001873
Thomas Wouters89f507f2006-12-13 04:49:30 +00001874 PyArena_AddPyObject(c->c_arena, pynum);
1875 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 }
Georg Brandldde00282007-03-18 19:01:53 +00001877 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001878 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 if (TYPE(ch) == RPAR)
1883 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884
Thomas Wouters89f507f2006-12-13 04:49:30 +00001885 if (TYPE(ch) == yield_expr)
1886 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001889 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001890 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001891
Nick Coghlan650f0d02007-04-15 12:05:43 +00001892 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 if (TYPE(ch) == RSQB)
1897 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1901 asdl_seq *elts = seq_for_testlist(c, ch);
1902 if (!elts)
1903 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001904
Thomas Wouters89f507f2006-12-13 04:49:30 +00001905 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1906 }
1907 else
1908 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001910 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1911 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001912 int i, size;
1913 asdl_seq *keys, *values;
1914
1915 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001916 if (TYPE(ch) == RBRACE) {
1917 /* it's an empty dict */
1918 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1919 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1920 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001921 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001922 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001923 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001925 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001926 for (i = 0; i < NCH(ch); i += 2) {
1927 expr_ty expression;
1928 expression = ast_for_expr(c, CHILD(ch, i));
1929 if (!expression)
1930 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001932 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001933 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1934 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1935 /* it's a set comprehension */
1936 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001937 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1938 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001939 } else {
1940 /* it's a dict */
1941 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1942 keys = asdl_seq_new(size, c->c_arena);
1943 if (!keys)
1944 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945
Guido van Rossum86e58e22006-08-28 15:27:34 +00001946 values = asdl_seq_new(size, c->c_arena);
1947 if (!values)
1948 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949
Guido van Rossum86e58e22006-08-28 15:27:34 +00001950 for (i = 0; i < NCH(ch); i += 4) {
1951 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952
Guido van Rossum86e58e22006-08-28 15:27:34 +00001953 expression = ast_for_expr(c, CHILD(ch, i));
1954 if (!expression)
1955 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001956
Guido van Rossum86e58e22006-08-28 15:27:34 +00001957 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001958
Guido van Rossum86e58e22006-08-28 15:27:34 +00001959 expression = ast_for_expr(c, CHILD(ch, i + 2));
1960 if (!expression)
1961 return NULL;
1962
1963 asdl_seq_SET(values, i / 4, expression);
1964 }
1965 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1966 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
1972}
1973
1974static slice_ty
1975ast_for_slice(struct compiling *c, const node *n)
1976{
1977 node *ch;
1978 expr_ty lower = NULL, upper = NULL, step = NULL;
1979
1980 REQ(n, subscript);
1981
1982 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001983 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 sliceop: ':' [test]
1985 */
1986 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (NCH(n) == 1 && TYPE(ch) == test) {
1988 /* 'step' variable hold no significance in terms of being used over
1989 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (!step)
1992 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 }
1996
1997 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 if (!lower)
2000 return NULL;
2001 }
2002
2003 /* If there's an upper bound it's in the second or third position. */
2004 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 if (NCH(n) > 1) {
2006 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 if (TYPE(n2) == test) {
2009 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 if (!upper)
2011 return NULL;
2012 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016
Thomas Wouters89f507f2006-12-13 04:49:30 +00002017 if (TYPE(n2) == test) {
2018 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 if (!upper)
2020 return NULL;
2021 }
2022 }
2023
2024 ch = CHILD(n, NCH(n) - 1);
2025 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002026 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002027 ch = CHILD(ch, 1);
2028 if (TYPE(ch) == test) {
2029 step = ast_for_expr(c, ch);
2030 if (!step)
2031 return NULL;
2032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
2034 }
2035
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002036 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
2039static expr_ty
2040ast_for_binop(struct compiling *c, const node *n)
2041{
Guido van Rossumd8faa362007-04-27 19:54:29 +00002042 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00002044 BinOp(BinOp(A, op, B), op, C).
2045 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Guido van Rossumd8faa362007-04-27 19:54:29 +00002047 int i, nops;
2048 expr_ty expr1, expr2, result;
2049 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050
Guido van Rossumd8faa362007-04-27 19:54:29 +00002051 expr1 = ast_for_expr(c, CHILD(n, 0));
2052 if (!expr1)
2053 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Guido van Rossumd8faa362007-04-27 19:54:29 +00002055 expr2 = ast_for_expr(c, CHILD(n, 2));
2056 if (!expr2)
2057 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058
Guido van Rossumd8faa362007-04-27 19:54:29 +00002059 newoperator = get_operator(CHILD(n, 1));
2060 if (!newoperator)
2061 return NULL;
2062
2063 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2064 c->c_arena);
2065 if (!result)
2066 return NULL;
2067
2068 nops = (NCH(n) - 1) / 2;
2069 for (i = 1; i < nops; i++) {
2070 expr_ty tmp_result, tmp;
2071 const node* next_oper = CHILD(n, i * 2 + 1);
2072
2073 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002074 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 return NULL;
2076
Guido van Rossumd8faa362007-04-27 19:54:29 +00002077 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
2078 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 return NULL;
2080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002082 LINENO(next_oper), next_oper->n_col_offset,
2083 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002085 return NULL;
2086 result = tmp_result;
2087 }
2088 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089}
2090
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002091static expr_ty
2092ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
2093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002095 subscriptlist: subscript (',' subscript)* [',']
2096 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
2097 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002098 REQ(n, trailer);
2099 if (TYPE(CHILD(n, 0)) == LPAR) {
2100 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
2102 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002103 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002104 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002105 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002106 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00002107 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
2108 if (!attr_id)
2109 return NULL;
2110 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002111 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00002112 }
2113 else {
2114 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002115 REQ(CHILD(n, 2), RSQB);
2116 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002117 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002118 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
2119 if (!slc)
2120 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002121 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
2122 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002123 }
2124 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002126 by treating the sequence as a tuple literal if there are
2127 no slice features.
2128 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002129 int j;
2130 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002131 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002132 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002133 asdl_seq *slices, *elts;
2134 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002135 if (!slices)
2136 return NULL;
2137 for (j = 0; j < NCH(n); j += 2) {
2138 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002139 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002140 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002141 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00002142 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002143 asdl_seq_SET(slices, j / 2, slc);
2144 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002145 if (!simple) {
2146 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002147 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002148 }
2149 /* extract Index values and put them in a Tuple */
2150 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002151 if (!elts)
2152 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002153 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
2154 slc = (slice_ty)asdl_seq_GET(slices, j);
2155 assert(slc->kind == Index_kind && slc->v.Index.value);
2156 asdl_seq_SET(elts, j, slc->v.Index.value);
2157 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002158 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00002159 if (!e)
2160 return NULL;
2161 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002162 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002163 }
2164 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002165}
2166
2167static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002168ast_for_factor(struct compiling *c, const node *n)
2169{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002170 expr_ty expression;
2171
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002172 expression = ast_for_expr(c, CHILD(n, 1));
2173 if (!expression)
2174 return NULL;
2175
2176 switch (TYPE(CHILD(n, 0))) {
2177 case PLUS:
2178 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
2179 c->c_arena);
2180 case MINUS:
2181 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
2182 c->c_arena);
2183 case TILDE:
2184 return UnaryOp(Invert, expression, LINENO(n),
2185 n->n_col_offset, c->c_arena);
2186 }
2187 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
2188 TYPE(CHILD(n, 0)));
2189 return NULL;
2190}
2191
2192static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002193ast_for_power(struct compiling *c, const node *n)
2194{
2195 /* power: atom trailer* ('**' factor)*
2196 */
2197 int i;
2198 expr_ty e, tmp;
2199 REQ(n, power);
2200 e = ast_for_atom(c, CHILD(n, 0));
2201 if (!e)
2202 return NULL;
2203 if (NCH(n) == 1)
2204 return e;
2205 for (i = 1; i < NCH(n); i++) {
2206 node *ch = CHILD(n, i);
2207 if (TYPE(ch) != trailer)
2208 break;
2209 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002210 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002211 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002212 tmp->lineno = e->lineno;
2213 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002214 e = tmp;
2215 }
2216 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
2217 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002218 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002219 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002220 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002222 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002223 e = tmp;
2224 }
2225 return e;
2226}
2227
Guido van Rossum0368b722007-05-11 16:50:42 +00002228static expr_ty
2229ast_for_starred(struct compiling *c, const node *n)
2230{
2231 expr_ty tmp;
2232 REQ(n, star_expr);
2233
2234 tmp = ast_for_expr(c, CHILD(n, 1));
2235 if (!tmp)
2236 return NULL;
2237
2238 /* The Load context is changed later. */
2239 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2240}
2241
2242
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243/* Do not name a variable 'expr'! Will cause a compile error.
2244*/
2245
2246static expr_ty
2247ast_for_expr(struct compiling *c, const node *n)
2248{
2249 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002250 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00002251 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 and_test: not_test ('and' not_test)*
2254 not_test: 'not' not_test | comparison
2255 comparison: expr (comp_op expr)*
2256 expr: xor_expr ('|' xor_expr)*
2257 xor_expr: and_expr ('^' and_expr)*
2258 and_expr: shift_expr ('&' shift_expr)*
2259 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
2260 arith_expr: term (('+'|'-') term)*
2261 term: factor (('*'|'/'|'%'|'//') factor)*
2262 factor: ('+'|'-'|'~') factor | power
2263 power: atom trailer* ('**' factor)*
2264 */
2265
2266 asdl_seq *seq;
2267 int i;
2268
2269 loop:
2270 switch (TYPE(n)) {
2271 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00002272 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002273 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00002274 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002276 else if (NCH(n) > 1)
2277 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002278 /* Fallthrough */
2279 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 case and_test:
2281 if (NCH(n) == 1) {
2282 n = CHILD(n, 0);
2283 goto loop;
2284 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 if (!seq)
2287 return NULL;
2288 for (i = 0; i < NCH(n); i += 2) {
2289 expr_ty e = ast_for_expr(c, CHILD(n, i));
2290 if (!e)
2291 return NULL;
2292 asdl_seq_SET(seq, i / 2, e);
2293 }
2294 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002295 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
2296 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002297 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002298 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 case not_test:
2300 if (NCH(n) == 1) {
2301 n = CHILD(n, 0);
2302 goto loop;
2303 }
2304 else {
2305 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2306 if (!expression)
2307 return NULL;
2308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002309 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
2310 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 }
2312 case comparison:
2313 if (NCH(n) == 1) {
2314 n = CHILD(n, 0);
2315 goto loop;
2316 }
2317 else {
2318 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002319 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002320 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002321 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 if (!ops)
2323 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002324 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 return NULL;
2327 }
2328 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002329 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002331 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002332 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
2336 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002337 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 asdl_seq_SET(cmps, i / 2, expression);
2343 }
2344 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002345 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002347 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002349 return Compare(expression, ops, cmps, LINENO(n),
2350 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 }
2352 break;
2353
Guido van Rossum0368b722007-05-11 16:50:42 +00002354 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 /* The next five cases all handle BinOps. The main body of code
2357 is the same in each case, but the switch turned inside out to
2358 reuse the code for each type of operator.
2359 */
2360 case expr:
2361 case xor_expr:
2362 case and_expr:
2363 case shift_expr:
2364 case arith_expr:
2365 case term:
2366 if (NCH(n) == 1) {
2367 n = CHILD(n, 0);
2368 goto loop;
2369 }
2370 return ast_for_binop(c, n);
2371 case yield_expr: {
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002372 node *an = NULL;
2373 node *en = NULL;
2374 int is_from = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 expr_ty exp = NULL;
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002376 if (NCH(n) > 1)
2377 an = CHILD(n, 1); /* yield_arg */
2378 if (an) {
2379 en = CHILD(an, NCH(an) - 1);
2380 if (NCH(an) == 2) {
2381 is_from = 1;
2382 exp = ast_for_expr(c, en);
2383 }
2384 else
2385 exp = ast_for_testlist(c, en);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002386 if (!exp)
2387 return NULL;
2388 }
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002389 return Yield(is_from, exp, LINENO(n), n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002391 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 if (NCH(n) == 1) {
2393 n = CHILD(n, 0);
2394 goto loop;
2395 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002396 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00002397 case power:
2398 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002400 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 return NULL;
2402 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002403 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return NULL;
2405}
2406
2407static expr_ty
2408ast_for_call(struct compiling *c, const node *n, expr_ty func)
2409{
2410 /*
2411 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
2412 | '**' test)
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002413 argument: [test '='] (test) [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 */
2415
2416 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002417 asdl_seq *args;
2418 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 expr_ty vararg = NULL, kwarg = NULL;
2420
2421 REQ(n, arglist);
2422
2423 nargs = 0;
2424 nkeywords = 0;
2425 ngens = 0;
2426 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 node *ch = CHILD(n, i);
2428 if (TYPE(ch) == argument) {
2429 if (NCH(ch) == 1)
2430 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002431 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 nkeywords++;
2435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436 }
2437 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002438 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 "if not sole argument");
2440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
2442
2443 if (nargs + nkeywords + ngens > 255) {
2444 ast_error(n, "more than 255 arguments");
2445 return NULL;
2446 }
2447
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002448 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002449 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002450 return NULL;
2451 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002453 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 nargs = 0;
2455 nkeywords = 0;
2456 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 node *ch = CHILD(n, i);
2458 if (TYPE(ch) == argument) {
2459 expr_ty e;
2460 if (NCH(ch) == 1) {
2461 if (nkeywords) {
2462 ast_error(CHILD(ch, 0),
2463 "non-keyword arg after keyword arg");
2464 return NULL;
2465 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00002466 if (vararg) {
2467 ast_error(CHILD(ch, 0),
2468 "only named arguments may follow *expression");
2469 return NULL;
2470 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002473 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002476 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002479 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 else {
2483 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002484 identifier key, tmp;
2485 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002490 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 /* f(lambda x: x[0] = 3) ends up getting parsed with
2492 * LHS test = lambda x: x[0], and RHS test = 3.
2493 * SF bug 132313 points out that complaining about a keyword
2494 * then is very confusing.
2495 */
2496 if (e->kind == Lambda_kind) {
2497 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499 } else if (e->kind != Name_kind) {
2500 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002502 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 return NULL;
2504 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002506 for (k = 0; k < nkeywords; k++) {
2507 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2508 if (!PyUnicode_Compare(tmp, key)) {
2509 ast_error(CHILD(ch, 0), "keyword argument repeated");
2510 return NULL;
2511 }
2512 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002515 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002516 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002518 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002519 asdl_seq_SET(keywords, nkeywords++, kw);
2520 }
2521 }
2522 else if (TYPE(ch) == STAR) {
2523 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002524 if (!vararg)
2525 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002526 i++;
2527 }
2528 else if (TYPE(ch) == DOUBLESTAR) {
2529 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002530 if (!kwarg)
2531 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002532 i++;
2533 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 }
2535
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002536 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537}
2538
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002540ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002542 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002543 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002545 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002546 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002547 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002548 }
2549 else {
2550 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002551 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002552 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 else {
2556 asdl_seq *tmp = seq_for_testlist(c, n);
2557 if (!tmp)
2558 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002561}
2562
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563static stmt_ty
2564ast_for_expr_stmt(struct compiling *c, const node *n)
2565{
2566 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002569 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 test: ... here starts the operator precendence dance
2573 */
2574
2575 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002576 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 if (!e)
2578 return NULL;
2579
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 }
2582 else if (TYPE(CHILD(n, 1)) == augassign) {
2583 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002584 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 if (!expr1)
2589 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002590 if(!set_context(c, expr1, Store, ch))
2591 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002592 /* set_context checks that most expressions are not the left side.
2593 Augmented assignments can only have a name, a subscript, or an
2594 attribute on the left, though, so we have to explicitly check for
2595 those. */
2596 switch (expr1->kind) {
2597 case Name_kind:
2598 case Attribute_kind:
2599 case Subscript_kind:
2600 break;
2601 default:
2602 ast_error(ch, "illegal expression for augmented assignment");
2603 return NULL;
2604 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 ch = CHILD(n, 2);
2607 if (TYPE(ch) == testlist)
2608 expr2 = ast_for_testlist(c, ch);
2609 else
2610 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002611 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 return NULL;
2613
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002614 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002615 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616 return NULL;
2617
Thomas Wouters89f507f2006-12-13 04:49:30 +00002618 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 }
2620 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002621 int i;
2622 asdl_seq *targets;
2623 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 expr_ty expression;
2625
Thomas Wouters89f507f2006-12-13 04:49:30 +00002626 /* a normal assignment */
2627 REQ(CHILD(n, 1), EQUAL);
2628 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2629 if (!targets)
2630 return NULL;
2631 for (i = 0; i < NCH(n) - 2; i += 2) {
2632 expr_ty e;
2633 node *ch = CHILD(n, i);
2634 if (TYPE(ch) == yield_expr) {
2635 ast_error(ch, "assignment to yield expression not possible");
2636 return NULL;
2637 }
2638 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002640 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002642 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002643 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002644 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645
Thomas Wouters89f507f2006-12-13 04:49:30 +00002646 asdl_seq_SET(targets, i / 2, e);
2647 }
2648 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002649 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002650 expression = ast_for_testlist(c, value);
2651 else
2652 expression = ast_for_expr(c, value);
2653 if (!expression)
2654 return NULL;
2655 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657}
2658
Benjamin Peterson78565b22009-06-28 19:19:51 +00002659
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002661ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662{
2663 asdl_seq *seq;
2664 int i;
2665 expr_ty e;
2666
2667 REQ(n, exprlist);
2668
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002669 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 e = ast_for_expr(c, CHILD(n, i));
2674 if (!e)
2675 return NULL;
2676 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002677 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 }
2680 return seq;
2681}
2682
2683static stmt_ty
2684ast_for_del_stmt(struct compiling *c, const node *n)
2685{
2686 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 /* del_stmt: 'del' exprlist */
2689 REQ(n, del_stmt);
2690
2691 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2692 if (!expr_list)
2693 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002694 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695}
2696
2697static stmt_ty
2698ast_for_flow_stmt(struct compiling *c, const node *n)
2699{
2700 /*
2701 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2702 | yield_stmt
2703 break_stmt: 'break'
2704 continue_stmt: 'continue'
2705 return_stmt: 'return' [testlist]
2706 yield_stmt: yield_expr
Nick Coghlan1f7ce622012-01-13 21:43:40 +10002707 yield_expr: 'yield' testlist | 'yield' 'from' test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 raise_stmt: 'raise' [test [',' test [',' test]]]
2709 */
2710 node *ch;
2711
2712 REQ(n, flow_stmt);
2713 ch = CHILD(n, 0);
2714 switch (TYPE(ch)) {
2715 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002716 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002718 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2721 if (!exp)
2722 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002723 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 }
2725 case return_stmt:
2726 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002727 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002729 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 if (!expression)
2731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002732 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 }
2734 case raise_stmt:
2735 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002736 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2737 else if (NCH(ch) >= 2) {
2738 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2740 if (!expression)
2741 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002742 if (NCH(ch) == 4) {
2743 cause = ast_for_expr(c, CHILD(ch, 3));
2744 if (!cause)
2745 return NULL;
2746 }
2747 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 }
2749 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002750 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 "unexpected flow_stmt: %d", TYPE(ch));
2752 return NULL;
2753 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002754
2755 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757}
2758
2759static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002760alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761{
2762 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002763 import_as_name: NAME ['as' NAME]
2764 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 dotted_name: NAME ('.' NAME)*
2766 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002767 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002768
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 loop:
2770 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002771 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002772 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002773 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002774 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002775 if (!name)
2776 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002777 if (NCH(n) == 3) {
2778 node *str_node = CHILD(n, 2);
2779 str = NEW_IDENTIFIER(str_node);
2780 if (!str)
2781 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002782 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002783 return NULL;
2784 }
2785 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002786 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002787 return NULL;
2788 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002789 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002790 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 case dotted_as_name:
2792 if (NCH(n) == 1) {
2793 n = CHILD(n, 0);
2794 goto loop;
2795 }
2796 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002797 node *asname_node = CHILD(n, 2);
2798 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002799 if (!a)
2800 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002802 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002803 if (!a->asname)
2804 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002805 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002806 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 return a;
2808 }
2809 break;
2810 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002811 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002812 node *name_node = CHILD(n, 0);
2813 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002814 if (!name)
2815 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002816 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002817 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002818 return alias(name, NULL, c->c_arena);
2819 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 else {
2821 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002822 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002823 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826
2827 len = 0;
2828 for (i = 0; i < NCH(n); i += 2)
2829 /* length of string plus one for the dot */
2830 len += strlen(STR(CHILD(n, i))) + 1;
2831 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002832 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 if (!str)
2834 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002835 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 if (!s)
2837 return NULL;
2838 for (i = 0; i < NCH(n); i += 2) {
2839 char *sch = STR(CHILD(n, i));
2840 strcpy(s, STR(CHILD(n, i)));
2841 s += strlen(sch);
2842 *s++ = '.';
2843 }
2844 --s;
2845 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2847 PyBytes_GET_SIZE(str),
2848 NULL);
2849 Py_DECREF(str);
2850 if (!uni)
2851 return NULL;
2852 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002853 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002855 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 }
2857 break;
2858 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002859 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002860 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002861 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002863 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 "unexpected import name: %d", TYPE(n));
2865 return NULL;
2866 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002867
2868 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 return NULL;
2870}
2871
2872static stmt_ty
2873ast_for_import_stmt(struct compiling *c, const node *n)
2874{
2875 /*
2876 import_stmt: import_name | import_from
2877 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002878 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2879 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002881 int lineno;
2882 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 int i;
2884 asdl_seq *aliases;
2885
2886 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002887 lineno = LINENO(n);
2888 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002890 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002892 REQ(n, dotted_as_names);
2893 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2894 if (!aliases)
2895 return NULL;
2896 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002897 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002898 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002900 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002901 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002902 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002904 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002906 int idx, ndots = 0;
2907 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002908 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002910 /* Count the number of dots (for relative imports) and check for the
2911 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 for (idx = 1; idx < NCH(n); idx++) {
2913 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002914 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2915 if (!mod)
2916 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 idx++;
2918 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002919 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002921 ndots += 3;
2922 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002923 } else if (TYPE(CHILD(n, idx)) != DOT) {
2924 break;
2925 }
2926 ndots++;
2927 }
2928 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002929 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002930 case STAR:
2931 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002932 n = CHILD(n, idx);
2933 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002934 break;
2935 case LPAR:
2936 /* from ... import (x, y, z) */
2937 n = CHILD(n, idx + 1);
2938 n_children = NCH(n);
2939 break;
2940 case import_as_names:
2941 /* from ... import x, y, z */
2942 n = CHILD(n, idx);
2943 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002944 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 ast_error(n, "trailing comma not allowed without"
2946 " surrounding parentheses");
2947 return NULL;
2948 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002949 break;
2950 default:
2951 ast_error(n, "Unexpected node-type in from-import");
2952 return NULL;
2953 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2956 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958
2959 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002960 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002961 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002962 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002964 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002966 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002968 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002969 if (!import_alias)
2970 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002972 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002974 if (mod != NULL)
2975 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002976 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002977 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 }
Neal Norwitz79792652005-11-14 04:25:03 +00002979 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 "unknown import statement: starts with command '%s'",
2981 STR(CHILD(n, 0)));
2982 return NULL;
2983}
2984
2985static stmt_ty
2986ast_for_global_stmt(struct compiling *c, const node *n)
2987{
2988 /* global_stmt: 'global' NAME (',' NAME)* */
2989 identifier name;
2990 asdl_seq *s;
2991 int i;
2992
2993 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002994 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002996 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002998 name = NEW_IDENTIFIER(CHILD(n, i));
2999 if (!name)
3000 return NULL;
3001 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003003 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004}
3005
3006static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00003007ast_for_nonlocal_stmt(struct compiling *c, const node *n)
3008{
3009 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
3010 identifier name;
3011 asdl_seq *s;
3012 int i;
3013
3014 REQ(n, nonlocal_stmt);
3015 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
3016 if (!s)
3017 return NULL;
3018 for (i = 1; i < NCH(n); i += 2) {
3019 name = NEW_IDENTIFIER(CHILD(n, i));
3020 if (!name)
3021 return NULL;
3022 asdl_seq_SET(s, i / 2, name);
3023 }
3024 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
3025}
3026
3027static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028ast_for_assert_stmt(struct compiling *c, const node *n)
3029{
3030 /* assert_stmt: 'assert' test [',' test] */
3031 REQ(n, assert_stmt);
3032 if (NCH(n) == 2) {
3033 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
3034 if (!expression)
3035 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003036 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 }
3038 else if (NCH(n) == 4) {
3039 expr_ty expr1, expr2;
3040
3041 expr1 = ast_for_expr(c, CHILD(n, 1));
3042 if (!expr1)
3043 return NULL;
3044 expr2 = ast_for_expr(c, CHILD(n, 3));
3045 if (!expr2)
3046 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047
Thomas Wouters89f507f2006-12-13 04:49:30 +00003048 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 }
Neal Norwitz79792652005-11-14 04:25:03 +00003050 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 "improper number of parts to 'assert' statement: %d",
3052 NCH(n));
3053 return NULL;
3054}
3055
3056static asdl_seq *
3057ast_for_suite(struct compiling *c, const node *n)
3058{
3059 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00003060 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061 stmt_ty s;
3062 int i, total, num, end, pos = 0;
3063 node *ch;
3064
3065 REQ(n, suite);
3066
3067 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003068 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 n = CHILD(n, 0);
3073 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 */
3076 end = NCH(n) - 1;
3077 if (TYPE(CHILD(n, end - 1)) == SEMI)
3078 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003080 for (i = 0; i < end; i += 2) {
3081 ch = CHILD(n, i);
3082 s = ast_for_stmt(c, ch);
3083 if (!s)
3084 return NULL;
3085 asdl_seq_SET(seq, pos++, s);
3086 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 }
3088 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003089 for (i = 2; i < (NCH(n) - 1); i++) {
3090 ch = CHILD(n, i);
3091 REQ(ch, stmt);
3092 num = num_stmts(ch);
3093 if (num == 1) {
3094 /* small_stmt or compound_stmt with only one child */
3095 s = ast_for_stmt(c, ch);
3096 if (!s)
3097 return NULL;
3098 asdl_seq_SET(seq, pos++, s);
3099 }
3100 else {
3101 int j;
3102 ch = CHILD(ch, 0);
3103 REQ(ch, simple_stmt);
3104 for (j = 0; j < NCH(ch); j += 2) {
3105 /* statement terminates with a semi-colon ';' */
3106 if (NCH(CHILD(ch, j)) == 0) {
3107 assert((j + 1) == NCH(ch));
3108 break;
3109 }
3110 s = ast_for_stmt(c, CHILD(ch, j));
3111 if (!s)
3112 return NULL;
3113 asdl_seq_SET(seq, pos++, s);
3114 }
3115 }
3116 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 }
3118 assert(pos == seq->size);
3119 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120}
3121
3122static stmt_ty
3123ast_for_if_stmt(struct compiling *c, const node *n)
3124{
3125 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
3126 ['else' ':' suite]
3127 */
3128 char *s;
3129
3130 REQ(n, if_stmt);
3131
3132 if (NCH(n) == 4) {
3133 expr_ty expression;
3134 asdl_seq *suite_seq;
3135
3136 expression = ast_for_expr(c, CHILD(n, 1));
3137 if (!expression)
3138 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003140 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142
Guido van Rossumd8faa362007-04-27 19:54:29 +00003143 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
3144 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003146
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 s = STR(CHILD(n, 4));
3148 /* s[2], the third character in the string, will be
3149 's' for el_s_e, or
3150 'i' for el_i_f
3151 */
3152 if (s[2] == 's') {
3153 expr_ty expression;
3154 asdl_seq *seq1, *seq2;
3155
3156 expression = ast_for_expr(c, CHILD(n, 1));
3157 if (!expression)
3158 return NULL;
3159 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003160 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161 return NULL;
3162 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003163 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164 return NULL;
3165
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
3167 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168 }
3169 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003170 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 expr_ty expression;
3172 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003173 asdl_seq *orelse = NULL;
3174 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003175 /* must reference the child n_elif+1 since 'else' token is third,
3176 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003177 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
3178 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
3179 has_else = 1;
3180 n_elif -= 3;
3181 }
3182 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183
Thomas Wouters89f507f2006-12-13 04:49:30 +00003184 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003186
Thomas Wouters89f507f2006-12-13 04:49:30 +00003187 orelse = asdl_seq_new(1, c->c_arena);
3188 if (!orelse)
3189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003190 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003191 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
3194 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3197 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003198 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 asdl_seq_SET(orelse, 0,
3201 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 LINENO(CHILD(n, NCH(n) - 6)),
3203 CHILD(n, NCH(n) - 6)->n_col_offset,
3204 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 /* the just-created orelse handled the last elif */
3206 n_elif--;
3207 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208
Thomas Wouters89f507f2006-12-13 04:49:30 +00003209 for (i = 0; i < n_elif; i++) {
3210 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003211 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
3212 if (!newobj)
3213 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003215 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003218 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220
Thomas Wouters89f507f2006-12-13 04:49:30 +00003221 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 LINENO(CHILD(n, off)),
3224 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003225 orelse = newobj;
3226 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 expression = ast_for_expr(c, CHILD(n, 1));
3228 if (!expression)
3229 return NULL;
3230 suite_seq = ast_for_suite(c, CHILD(n, 3));
3231 if (!suite_seq)
3232 return NULL;
3233 return If(expression, suite_seq, orelse,
3234 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003236
3237 PyErr_Format(PyExc_SystemError,
3238 "unexpected token in 'if' statement: %s", s);
3239 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240}
3241
3242static stmt_ty
3243ast_for_while_stmt(struct compiling *c, const node *n)
3244{
3245 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
3246 REQ(n, while_stmt);
3247
3248 if (NCH(n) == 4) {
3249 expr_ty expression;
3250 asdl_seq *suite_seq;
3251
3252 expression = ast_for_expr(c, CHILD(n, 1));
3253 if (!expression)
3254 return NULL;
3255 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003256 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003258 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003259 }
3260 else if (NCH(n) == 7) {
3261 expr_ty expression;
3262 asdl_seq *seq1, *seq2;
3263
3264 expression = ast_for_expr(c, CHILD(n, 1));
3265 if (!expression)
3266 return NULL;
3267 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003268 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269 return NULL;
3270 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003271 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272 return NULL;
3273
Thomas Wouters89f507f2006-12-13 04:49:30 +00003274 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003276
3277 PyErr_Format(PyExc_SystemError,
3278 "wrong number of tokens for 'while' statement: %d",
3279 NCH(n));
3280 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281}
3282
3283static stmt_ty
3284ast_for_for_stmt(struct compiling *c, const node *n)
3285{
Neal Norwitz84456bd2005-12-18 03:16:20 +00003286 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003288 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003289 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
3291 REQ(n, for_stmt);
3292
3293 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003294 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 if (!seq)
3296 return NULL;
3297 }
3298
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003299 node_target = CHILD(n, 1);
3300 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003301 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003303 /* Check the # of children rather than the length of _target, since
3304 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003305 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003306 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003307 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00003309 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00003311 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003312 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 return NULL;
3314 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003315 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316 return NULL;
3317
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003318 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3319 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
3322static excepthandler_ty
3323ast_for_except_clause(struct compiling *c, const node *exc, node *body)
3324{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003325 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003326 REQ(exc, except_clause);
3327 REQ(body, suite);
3328
3329 if (NCH(exc) == 1) {
3330 asdl_seq *suite_seq = ast_for_suite(c, body);
3331 if (!suite_seq)
3332 return NULL;
3333
Neal Norwitzad74aa82008-03-31 05:14:30 +00003334 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003335 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 }
3337 else if (NCH(exc) == 2) {
3338 expr_ty expression;
3339 asdl_seq *suite_seq;
3340
3341 expression = ast_for_expr(c, CHILD(exc, 1));
3342 if (!expression)
3343 return NULL;
3344 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003345 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 return NULL;
3347
Neal Norwitzad74aa82008-03-31 05:14:30 +00003348 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003349 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003350 }
3351 else if (NCH(exc) == 4) {
3352 asdl_seq *suite_seq;
3353 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00003354 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00003355 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003357 if (forbidden_name(e, CHILD(exc, 3), 0))
3358 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003360 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361 return NULL;
3362 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00003363 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364 return NULL;
3365
Neal Norwitzad74aa82008-03-31 05:14:30 +00003366 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003367 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00003369
3370 PyErr_Format(PyExc_SystemError,
3371 "wrong number of children for 'except' clause: %d",
3372 NCH(exc));
3373 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374}
3375
3376static stmt_ty
3377ast_for_try_stmt(struct compiling *c, const node *n)
3378{
Neal Norwitzf599f422005-12-17 21:33:47 +00003379 const int nch = NCH(n);
3380 int n_except = (nch - 3)/3;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003381 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
Neal Norwitzf599f422005-12-17 21:33:47 +00003382
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383 REQ(n, try_stmt);
3384
Neal Norwitzf599f422005-12-17 21:33:47 +00003385 body = ast_for_suite(c, CHILD(n, 2));
3386 if (body == NULL)
3387 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388
Neal Norwitzf599f422005-12-17 21:33:47 +00003389 if (TYPE(CHILD(n, nch - 3)) == NAME) {
3390 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3391 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3392 /* we can assume it's an "else",
3393 because nch >= 9 for try-else-finally and
3394 it would otherwise have a type of except_clause */
3395 orelse = ast_for_suite(c, CHILD(n, nch - 4));
3396 if (orelse == NULL)
3397 return NULL;
3398 n_except--;
3399 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400
Neal Norwitzf599f422005-12-17 21:33:47 +00003401 finally = ast_for_suite(c, CHILD(n, nch - 1));
3402 if (finally == NULL)
3403 return NULL;
3404 n_except--;
3405 }
3406 else {
3407 /* we can assume it's an "else",
3408 otherwise it would have a type of except_clause */
3409 orelse = ast_for_suite(c, CHILD(n, nch - 1));
3410 if (orelse == NULL)
3411 return NULL;
3412 n_except--;
3413 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003415 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00003416 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417 return NULL;
3418 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419
Neal Norwitzf599f422005-12-17 21:33:47 +00003420 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003421 int i;
Neal Norwitzf599f422005-12-17 21:33:47 +00003422 /* process except statements to create a try ... except */
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003423 handlers = asdl_seq_new(n_except, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00003424 if (handlers == NULL)
3425 return NULL;
3426
3427 for (i = 0; i < n_except; i++) {
3428 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3429 CHILD(n, 5 + i * 3));
3430 if (!e)
3431 return NULL;
3432 asdl_seq_SET(handlers, i, e);
3433 }
Neal Norwitzf599f422005-12-17 21:33:47 +00003434 }
3435
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003436 assert(finally != NULL || asdl_seq_LEN(handlers));
3437 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438}
3439
Georg Brandl0c315622009-05-25 21:10:36 +00003440/* with_item: test ['as' expr] */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003441static withitem_ty
3442ast_for_with_item(struct compiling *c, const node *n)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003443{
3444 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003445
Georg Brandl0c315622009-05-25 21:10:36 +00003446 REQ(n, with_item);
3447 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00003448 if (!context_expr)
3449 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00003450 if (NCH(n) == 3) {
3451 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00003452
3453 if (!optional_vars) {
3454 return NULL;
3455 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003456 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003457 return NULL;
3458 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00003459 }
3460
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461 return withitem(context_expr, optional_vars, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003462}
3463
Georg Brandl0c315622009-05-25 21:10:36 +00003464/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3465static stmt_ty
3466ast_for_with_stmt(struct compiling *c, const node *n)
3467{
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003468 int i, n_items;
3469 asdl_seq *items, *body;
Georg Brandl0c315622009-05-25 21:10:36 +00003470
3471 REQ(n, with_stmt);
3472
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003473 n_items = (NCH(n) - 2) / 2;
3474 items = asdl_seq_new(n_items, c->c_arena);
3475 for (i = 1; i < NCH(n) - 2; i += 2) {
3476 withitem_ty item = ast_for_with_item(c, CHILD(n, i));
3477 if (!item)
Georg Brandl0c315622009-05-25 21:10:36 +00003478 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003479 asdl_seq_SET(items, (i - 1) / 2, item);
Georg Brandl0c315622009-05-25 21:10:36 +00003480 }
3481
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003482 body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
3483 if (!body)
3484 return NULL;
3485
3486 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
Georg Brandl0c315622009-05-25 21:10:36 +00003487}
3488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003489static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003490ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003491{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003492 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003493 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003494 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003495 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003497 REQ(n, classdef);
3498
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003499 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003500 s = ast_for_suite(c, CHILD(n, 3));
3501 if (!s)
3502 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003503 classname = NEW_IDENTIFIER(CHILD(n, 1));
3504 if (!classname)
3505 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003506 if (forbidden_name(classname, CHILD(n, 3), 0))
3507 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003508 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3509 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003511
3512 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003513 s = ast_for_suite(c, CHILD(n,5));
3514 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003515 return NULL;
3516 classname = NEW_IDENTIFIER(CHILD(n, 1));
3517 if (!classname)
3518 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003519 if (forbidden_name(classname, CHILD(n, 3), 0))
3520 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003521 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3522 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523 }
3524
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003525 /* class NAME '(' arglist ')' ':' suite */
3526 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003527 {
3528 PyObject *dummy_name;
3529 expr_ty dummy;
3530 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3531 if (!dummy_name)
3532 return NULL;
3533 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3534 call = ast_for_call(c, CHILD(n, 3), dummy);
3535 if (!call)
3536 return NULL;
3537 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003538 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003539 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003540 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003541 classname = NEW_IDENTIFIER(CHILD(n, 1));
3542 if (!classname)
3543 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003544 if (forbidden_name(classname, CHILD(n, 1), 0))
3545 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003546
Benjamin Peterson30760062008-11-25 04:02:28 +00003547 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003548 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003549 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003550}
3551
3552static stmt_ty
3553ast_for_stmt(struct compiling *c, const node *n)
3554{
3555 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003556 assert(NCH(n) == 1);
3557 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558 }
3559 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003560 assert(num_stmts(n) == 1);
3561 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562 }
3563 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003564 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003565 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3566 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567 */
3568 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569 case expr_stmt:
3570 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571 case del_stmt:
3572 return ast_for_del_stmt(c, n);
3573 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003574 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575 case flow_stmt:
3576 return ast_for_flow_stmt(c, n);
3577 case import_stmt:
3578 return ast_for_import_stmt(c, n);
3579 case global_stmt:
3580 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003581 case nonlocal_stmt:
3582 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583 case assert_stmt:
3584 return ast_for_assert_stmt(c, n);
3585 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003586 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3588 TYPE(n), NCH(n));
3589 return NULL;
3590 }
3591 }
3592 else {
3593 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003594 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003595 */
3596 node *ch = CHILD(n, 0);
3597 REQ(n, compound_stmt);
3598 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003599 case if_stmt:
3600 return ast_for_if_stmt(c, ch);
3601 case while_stmt:
3602 return ast_for_while_stmt(c, ch);
3603 case for_stmt:
3604 return ast_for_for_stmt(c, ch);
3605 case try_stmt:
3606 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003607 case with_stmt:
3608 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003610 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003611 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003612 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 case decorated:
3614 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003616 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3618 TYPE(n), NCH(n));
3619 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003620 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 }
3622}
3623
3624static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003625parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003627 const char *end;
3628 long x;
3629 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003630 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003631 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003633 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003634 errno = 0;
3635 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003636 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003637 if (s[0] == '0') {
3638 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3639 if (x < 0 && errno == 0) {
3640 return PyLong_FromString((char *)s,
3641 (char **)0,
3642 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003643 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003644 }
3645 else
3646 x = PyOS_strtol((char *)s, (char **)&end, 0);
3647 if (*end == '\0') {
3648 if (errno != 0)
3649 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003650 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003651 }
3652 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003653 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003654 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003655 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3656 if (compl.imag == -1.0 && PyErr_Occurred())
3657 return NULL;
3658 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003659 }
3660 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003661 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003662 dx = PyOS_string_to_double(s, NULL, NULL);
3663 if (dx == -1.0 && PyErr_Occurred())
3664 return NULL;
3665 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003666 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667}
3668
3669static PyObject *
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003670decode_utf8(struct compiling *c, const char **sPtr, const char *end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003672 char *s, *t;
3673 t = s = (char *)*sPtr;
3674 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3675 while (s < end && (*s & 0x80)) s++;
3676 *sPtr = s;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003677 return PyUnicode_DecodeUTF8(t, s - t, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678}
3679
3680static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003681decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003682{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003683 PyObject *v, *u;
3684 char *buf;
3685 char *p;
3686 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003687
Guido van Rossumd8faa362007-04-27 19:54:29 +00003688 if (encoding == NULL) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003689 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003690 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003691 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003692 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003693 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003694 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3695 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3696 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003697 if (u == NULL)
3698 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003699 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003700 end = s + len;
3701 while (s < end) {
3702 if (*s == '\\') {
3703 *p++ = *s++;
3704 if (*s & 0x80) {
3705 strcpy(p, "u005c");
3706 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003707 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003708 }
3709 if (*s & 0x80) { /* XXX inefficient */
3710 PyObject *w;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003711 int kind;
3712 void *data;
3713 Py_ssize_t len, i;
3714 w = decode_utf8(c, &s, end);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003715 if (w == NULL) {
3716 Py_DECREF(u);
3717 return NULL;
3718 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003719 kind = PyUnicode_KIND(w);
3720 data = PyUnicode_DATA(w);
3721 len = PyUnicode_GET_LENGTH(w);
3722 for (i = 0; i < len; i++) {
3723 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
3724 sprintf(p, "\\U%08x", chr);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003725 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003726 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003727 /* Should be impossible to overflow */
3728 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003729 Py_DECREF(w);
3730 } else {
3731 *p++ = *s++;
3732 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003733 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003734 len = p - buf;
3735 s = buf;
3736 }
3737 if (rawmode)
3738 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3739 else
3740 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3741 Py_XDECREF(u);
3742 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003743}
3744
3745/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003746 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003747 * parsestr parses it, and returns the decoded Python string object.
3748 */
3749static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003750parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003751{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003752 size_t len;
3753 const char *s = STR(n);
3754 int quote = Py_CHARMASK(*s);
3755 int rawmode = 0;
3756 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003757 if (isalpha(quote)) {
Antoine Pitrou3a5d4cb2012-01-12 22:46:19 +01003758 while (!*bytesmode || !rawmode) {
3759 if (quote == 'b' || quote == 'B') {
3760 quote = *++s;
3761 *bytesmode = 1;
3762 }
3763 else if (quote == 'r' || quote == 'R') {
3764 quote = *++s;
3765 rawmode = 1;
3766 }
3767 else {
3768 break;
3769 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003770 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003771 }
3772 if (quote != '\'' && quote != '\"') {
3773 PyErr_BadInternalCall();
3774 return NULL;
3775 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003776 s++;
3777 len = strlen(s);
3778 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003779 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003780 "string to parse is too long");
3781 return NULL;
3782 }
3783 if (s[--len] != quote) {
3784 PyErr_BadInternalCall();
3785 return NULL;
3786 }
3787 if (len >= 4 && s[0] == quote && s[1] == quote) {
3788 s += 2;
3789 len -= 2;
3790 if (s[--len] != quote || s[--len] != quote) {
3791 PyErr_BadInternalCall();
3792 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003793 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003794 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003795 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003796 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003797 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003798 if (*bytesmode) {
3799 /* Disallow non-ascii characters (but not escapes) */
3800 const char *c;
3801 for (c = s; *c; c++) {
3802 if (Py_CHARMASK(*c) >= 0x80) {
3803 ast_error(n, "bytes can only contain ASCII "
3804 "literal characters.");
3805 return NULL;
3806 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003807 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003808 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003809 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003810 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811 if (rawmode || strchr(s, '\\') == NULL) {
3812 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003813 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003814 if (u == NULL || !*bytesmode)
3815 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003816 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003817 Py_DECREF(u);
3818 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003819 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003820 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003821 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003822 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003824 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003825 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003826 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003827 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003828 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829}
3830
Guido van Rossum29fd7122007-11-12 01:13:56 +00003831/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003832 * compile-time literal catenation, calling parsestr() on each piece, and
3833 * pasting the intermediate results together.
3834 */
3835static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003836parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003837{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003838 PyObject *v;
3839 int i;
3840 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003841 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003842 if (v != NULL) {
3843 /* String literal concatenation */
3844 for (i = 1; i < NCH(n); i++) {
3845 PyObject *s;
3846 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003847 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003848 if (s == NULL)
3849 goto onError;
3850 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003851 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003852 goto onError;
3853 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003854 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3855 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003856 if (v == NULL)
3857 goto onError;
3858 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003859 else {
3860 PyObject *temp = PyUnicode_Concat(v, s);
3861 Py_DECREF(s);
3862 Py_DECREF(v);
3863 v = temp;
3864 if (v == NULL)
3865 goto onError;
3866 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003867 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003868 }
3869 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870
Guido van Rossumd8faa362007-04-27 19:54:29 +00003871 onError:
3872 Py_XDECREF(v);
3873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003874}