blob: 5c17133fc978333a47dcfef6932a77deac9521b6 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000061 if (*u >= 128) {
62 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
63 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
Martin v. Löwis47383402007-08-15 07:32:56 +000074 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000229 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000360 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 NULL,
362};
363
364static int
365forbidden_name(expr_ty e, const node *n)
366{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000368 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000369 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000370 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 ast_error(n, "assignment to keyword");
372 return 1;
373 }
374 }
375 return 0;
376}
377
Jeremy Hyltona8293132006-02-28 17:58:27 +0000378/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
380 Only sets context for expr kinds that "can appear in assignment context"
381 (according to ../Parser/Python.asdl). For other expr kinds, it sets
382 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000386set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
388 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389 /* If a particular expression type can't be used for assign / delete,
390 set expr_name to its name and an error message will be generated.
391 */
392 const char* expr_name = NULL;
393
394 /* The ast defines augmented store and load contexts, but the
395 implementation here doesn't actually use them. The code may be
396 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000399 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 */
401 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402
403 switch (e->kind) {
404 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Attribute.ctx = ctx;
406 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000408 e->v.Subscript.ctx = ctx;
409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 case Starred_kind:
411 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000412 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000413 return 0;
414 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000416 if (ctx == Store) {
417 if (forbidden_name(e, n))
418 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 }
420 e->v.Name.ctx = ctx;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.List.ctx = ctx;
424 s = e->v.List.elts;
425 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 case Tuple_kind:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000427 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Tuple.ctx = ctx;
430 s = e->v.Tuple.elts;
431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case Lambda_kind:
433 expr_name = "lambda";
434 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 case UnaryOp_kind:
441 expr_name = "operator";
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000444 expr_name = "generator expression";
445 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000446 case Yield_kind:
447 expr_name = "yield expression";
448 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000449 case ListComp_kind:
450 expr_name = "list comprehension";
451 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000452 case SetComp_kind:
453 expr_name = "set comprehension";
454 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000455 case DictComp_kind:
456 expr_name = "dict comprehension";
457 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000459 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 case Num_kind:
461 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 expr_name = "literal";
463 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000464 case Ellipsis_kind:
465 expr_name = "Ellipsis";
466 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000467 case Compare_kind:
468 expr_name = "comparison";
469 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 case IfExp_kind:
471 expr_name = "conditional expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 default:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000474 PyErr_Format(PyExc_SystemError,
475 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000476 e->kind, e->lineno);
477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000479 /* Check for error string set by switch */
480 if (expr_name) {
481 char buf[300];
482 PyOS_snprintf(buf, sizeof(buf),
483 "can't %s %s",
484 ctx == Store ? "assign to" : "delete",
485 expr_name);
486 return ast_error(n, buf);
487 }
488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000490 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000491 */
492 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000496 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 return 0;
498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 }
500 return 1;
501}
502
503static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000504ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505{
506 REQ(n, augassign);
507 n = CHILD(n, 0);
508 switch (STR(n)[0]) {
509 case '+':
510 return Add;
511 case '-':
512 return Sub;
513 case '/':
514 if (STR(n)[1] == '/')
515 return FloorDiv;
516 else
517 return Div;
518 case '%':
519 return Mod;
520 case '<':
521 return LShift;
522 case '>':
523 return RShift;
524 case '&':
525 return BitAnd;
526 case '^':
527 return BitXor;
528 case '|':
529 return BitOr;
530 case '*':
531 if (STR(n)[1] == '*')
532 return Pow;
533 else
534 return Mult;
535 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000536 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538 }
539}
540
541static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000542ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000544 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 |'is' 'not'
546 */
547 REQ(n, comp_op);
548 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 n = CHILD(n, 0);
550 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551 case LESS:
552 return Lt;
553 case GREATER:
554 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000555 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 return Eq;
557 case LESSEQUAL:
558 return LtE;
559 case GREATEREQUAL:
560 return GtE;
561 case NOTEQUAL:
562 return NotEq;
563 case NAME:
564 if (strcmp(STR(n), "in") == 0)
565 return In;
566 if (strcmp(STR(n), "is") == 0)
567 return Is;
568 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000569 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000571 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 /* handle "not in" and "is not" */
576 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 case NAME:
578 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
579 return NotIn;
580 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
581 return IsNot;
582 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000583 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000585 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Neal Norwitz79792652005-11-14 04:25:03 +0000588 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591}
592
593static asdl_seq *
594seq_for_testlist(struct compiling *c, const node *n)
595{
596 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000597 asdl_seq *seq;
598 expr_ty expression;
599 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000602 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 if (!seq)
604 return NULL;
605
606 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000607 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
613 assert(i / 2 < seq->size);
614 asdl_seq_SET(seq, i / 2, expression);
615 }
616 return seq;
617}
618
Neal Norwitzc1505362006-12-28 06:47:50 +0000619static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000621{
622 identifier name;
623 expr_ty annotation = NULL;
624 node *ch;
625
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000626 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000627 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 name = NEW_IDENTIFIER(ch);
629 if (!name)
630 return NULL;
631
632 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
633 annotation = ast_for_expr(c, CHILD(n, 2));
634 if (!annotation)
635 return NULL;
636 }
637
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000639#if 0
640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
641 if (!set_context(c, result, Store, n))
642 return NULL;
643 return result;
644#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645}
646
Guido van Rossum4f72a782006-10-27 23:31:49 +0000647/* returns -1 if failed to handle keyword only arguments
648 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 ^^^
651 start pointing here
652 */
653static int
654handle_keywordonly_args(struct compiling *c, const node *n, int start,
655 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
656{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000657 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000659 expr_ty expression, annotation;
660 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 int i = start;
662 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000663
664 if (kwonlyargs == NULL) {
665 ast_error(CHILD(n, start), "named arguments must follow bare *");
666 return -1;
667 }
668 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 while (i < NCH(n)) {
670 ch = CHILD(n, i);
671 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000672 case vfpdef:
673 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000675 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000676 if (!expression)
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000677 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000678 asdl_seq_SET(kwdefaults, j, expression);
679 i += 2; /* '=' and test */
680 }
681 else { /* setting NULL if no default value exists */
682 asdl_seq_SET(kwdefaults, j, NULL);
683 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 if (NCH(ch) == 3) {
685 /* ch is NAME ':' test */
686 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000687 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000689 }
690 else {
691 annotation = NULL;
692 }
693 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000694 argname = NEW_IDENTIFIER(ch);
695 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000696 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000697 arg = arg(argname, annotation, c->c_arena);
698 if (!arg)
699 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000701 i += 2; /* the name and the comma */
702 break;
703 case DOUBLESTAR:
704 return i;
705 default:
706 ast_error(ch, "unexpected node");
707 goto error;
708 }
709 }
710 return i;
711 error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000712 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000713}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
Jeremy Hyltona8293132006-02-28 17:58:27 +0000715/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716
717static arguments_ty
718ast_for_arguments(struct compiling *c, const node *n)
719{
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 /* This function handles both typedargslist (function definition)
721 and varargslist (lambda definition).
722
723 parameters: '(' [typedargslist] ')'
724 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000725 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000726 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000729 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000730 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000731 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000732 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000733 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 int i, j, k, nposargs = 0, nkwonlyargs = 0;
736 int nposdefaults = 0, found_default = 0;
737 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 arg_ty arg;
740 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 node *ch;
742
743 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000745 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
746 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Jeremy Hyltone921e022008-07-17 16:37:17 +0000751 /* First count the number of positional args & defaults. The
752 variable i is the loop index for this for loop and the next.
753 The next loop picks up where the first leaves off.
754 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 ch = CHILD(n, i);
757 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000758 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000759 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000760 if (i < NCH(n) && /* skip argument following star */
761 (TYPE(CHILD(n, i)) == tfpdef ||
762 TYPE(CHILD(n, i)) == vfpdef)) {
763 i++;
764 }
765 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000767 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000768 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000771 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 defaults for keyword only args */
773 for ( ; i < NCH(n); ++i) {
774 ch = CHILD(n, i);
775 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000776 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
779 if (!posargs && nposargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000780 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 kwonlyargs = (nkwonlyargs ?
782 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
783 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000784 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000785 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
787 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000788 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000789 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000790 since we set NULL as default for keyword only argument w/o default
791 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000792 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000793 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
794 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000795 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796
797 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 ast_error(n, "more than 255 arguments");
799 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000802 /* tfpdef: NAME [':' test]
803 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 */
805 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000806 j = 0; /* index for defaults */
807 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000809 ch = CHILD(n, i);
810 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000811 case tfpdef:
812 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
814 anything other than EQUAL or a comma? */
815 /* XXX Should NCH(n) check be made a separate check? */
816 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000817 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
818 if (!expression)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000819 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 assert(posdefaults != NULL);
821 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000825 else if (found_default) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000826 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 "non-default argument follows default argument");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000828 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000829 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000830 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000831 if (!arg)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000832 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000833 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 i += 2; /* the name and the comma */
835 break;
836 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 if (i+1 >= NCH(n)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000838 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000839 "named arguments must follow bare *");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000840 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000842 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 if (TYPE(ch) == COMMA) {
844 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000845 i += 2; /* now follows keyword only arguments */
846 res = handle_keywordonly_args(c, n, i,
847 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000848 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000849 i = res; /* res has new position to process */
850 }
851 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000853 if (!vararg)
854 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000856 /* there is an annotation on the vararg */
857 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000858 if (!varargannotation)
859 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000861 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000862 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
863 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000864 int res = 0;
865 res = handle_keywordonly_args(c, n, i,
866 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000867 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000868 i = res; /* res has new position to process */
869 }
870 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000871 break;
872 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000873 ch = CHILD(n, i+1); /* tfpdef */
874 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000875 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000876 if (!kwarg)
877 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000878 if (NCH(ch) > 1) {
879 /* there is an annotation on the kwarg */
880 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000881 if (!kwargannotation)
882 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000883 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 i += 3;
885 break;
886 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000887 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 "unexpected node in varargslist: %d @ %d",
889 TYPE(ch), i);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000890 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000891 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000893 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
894 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895}
896
897static expr_ty
898ast_for_dotted_name(struct compiling *c, const node *n)
899{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000900 expr_ty e;
901 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 int i;
904
905 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000906
907 lineno = LINENO(n);
908 col_offset = n->n_col_offset;
909
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 id = NEW_IDENTIFIER(CHILD(n, 0));
911 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000912 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000913 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
917 for (i = 2; i < NCH(n); i+=2) {
918 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 if (!id)
920 return NULL;
921 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
922 if (!e)
923 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 }
925
926 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929static expr_ty
930ast_for_decorator(struct compiling *c, const node *n)
931{
932 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
933 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000934 expr_ty name_expr;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000935
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 REQ(CHILD(n, 0), AT);
938 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
941 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000943
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = name_expr;
946 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 }
948 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 if (!d)
952 return NULL;
953 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000956 d = ast_for_call(c, CHILD(n, 3), name_expr);
957 if (!d)
958 return NULL;
959 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960 }
961
962 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static asdl_seq*
966ast_for_decorators(struct compiling *c, const node *n)
967{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000968 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000969 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 int i;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000973 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 if (!decorator_seq)
975 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000978 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000979 if (!d)
980 return NULL;
981 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
983 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000987ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000989 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000990 identifier name;
991 arguments_ty args;
992 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000993 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000994 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995
996 REQ(n, funcdef);
997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 name = NEW_IDENTIFIER(CHILD(n, name_i));
999 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1002 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001003 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001004 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1005 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1006 if (!returns)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00001007 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001008 name_i += 2;
1009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 body = ast_for_suite(c, CHILD(n, name_i + 3));
1011 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001012 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001015 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016}
1017
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001018static stmt_ty
1019ast_for_decorated(struct compiling *c, const node *n)
1020{
1021 /* decorated: decorators (classdef | funcdef) */
1022 stmt_ty thing = NULL;
1023 asdl_seq *decorator_seq = NULL;
1024
1025 REQ(n, decorated);
1026
1027 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1028 if (!decorator_seq)
1029 return NULL;
1030
1031 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001032 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001033
1034 if (TYPE(CHILD(n, 1)) == funcdef) {
1035 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1036 } else if (TYPE(CHILD(n, 1)) == classdef) {
1037 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1038 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001039 /* we count the decorators in when talking about the class' or
1040 * function's line number */
1041 if (thing) {
1042 thing->lineno = LINENO(n);
1043 thing->col_offset = n->n_col_offset;
1044 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001045 return thing;
1046}
1047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048static expr_ty
1049ast_for_lambdef(struct compiling *c, const node *n)
1050{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001051 /* lambdef: 'lambda' [varargslist] ':' test
1052 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 arguments_ty args;
1054 expr_ty expression;
1055
1056 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001057 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1058 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 if (!args)
1060 return NULL;
1061 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001062 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 }
1065 else {
1066 args = ast_for_arguments(c, CHILD(n, 1));
1067 if (!args)
1068 return NULL;
1069 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001070 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001074 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001077static expr_ty
1078ast_for_ifexpr(struct compiling *c, const node *n)
1079{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001080 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001081 expr_ty expression, body, orelse;
1082
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001083 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001084 body = ast_for_expr(c, CHILD(n, 0));
1085 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087 expression = ast_for_expr(c, CHILD(n, 2));
1088 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001090 orelse = ast_for_expr(c, CHILD(n, 4));
1091 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001093 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1094 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001095}
1096
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001098 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099
Nick Coghlan650f0d02007-04-15 12:05:43 +00001100 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101*/
1102
1103static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001104count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 count_comp_for:
1109 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001110 REQ(n, comp_for);
1111 if (NCH(n) == 5)
1112 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113 else
1114 return n_fors;
1115 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001116 REQ(n, comp_iter);
1117 n = CHILD(n, 0);
1118 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001119 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001120 else if (TYPE(n) == comp_if) {
1121 if (NCH(n) == 3) {
1122 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001123 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001125 else
1126 return n_fors;
1127 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001128
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 /* Should never be reached */
1130 PyErr_SetString(PyExc_SystemError,
1131 "logic error in count_comp_fors");
1132 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133}
1134
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138*/
1139
1140static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001141count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 while (1) {
1146 REQ(n, comp_iter);
1147 if (TYPE(CHILD(n, 0)) == comp_for)
1148 return n_ifs;
1149 n = CHILD(n, 0);
1150 REQ(n, comp_if);
1151 n_ifs++;
1152 if (NCH(n) == 2)
1153 return n_ifs;
1154 n = CHILD(n, 2);
1155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Guido van Rossum992d4a32007-07-11 13:09:30 +00001158static asdl_seq *
1159ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001162 asdl_seq *comps;
1163
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001164 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 if (n_fors == -1)
1166 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167
Nick Coghlan650f0d02007-04-15 12:05:43 +00001168 comps = asdl_seq_new(n_fors, c->c_arena);
1169 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001171
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001173 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 asdl_seq *t;
1175 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001176 node *for_ch;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178 REQ(n, comp_for);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001179
Guido van Rossum992d4a32007-07-11 13:09:30 +00001180 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001181 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001184 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187
Thomas Wouters89f507f2006-12-13 04:49:30 +00001188 /* Check the # of children rather than the length of t, since
1189 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1190 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1192 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 c->c_arena),
1196 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 int j, n_ifs;
1203 asdl_seq *ifs;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001204
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001206 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209
1210 ifs = asdl_seq_new(n_ifs, c->c_arena);
1211 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 REQ(n, comp_iter);
1216 n = CHILD(n, 0);
1217 REQ(n, comp_if);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001218
Guido van Rossum992d4a32007-07-11 13:09:30 +00001219 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001221 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001222 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 if (NCH(n) == 3)
1224 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001226 /* on exit, must guarantee that n is a comp_for */
1227 if (TYPE(n) == comp_iter)
1228 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001231 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001233 return comps;
1234}
1235
1236static expr_ty
1237ast_for_itercomp(struct compiling *c, const node *n, int type)
1238{
1239 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1240 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1241 expr_ty elt;
1242 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001243
Guido van Rossum992d4a32007-07-11 13:09:30 +00001244 assert(NCH(n) > 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001245
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 elt = ast_for_expr(c, CHILD(n, 0));
1247 if (!elt)
1248 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001249
Guido van Rossum992d4a32007-07-11 13:09:30 +00001250 comps = ast_for_comprehension(c, CHILD(n, 1));
1251 if (!comps)
1252 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253
1254 if (type == COMP_GENEXP)
1255 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1256 else if (type == COMP_LISTCOMP)
1257 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1258 else if (type == COMP_SETCOMP)
1259 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1260 else
1261 /* Should never happen */
1262 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266ast_for_dictcomp(struct compiling *c, const node *n)
1267{
1268 expr_ty key, value;
1269 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001270
Guido van Rossum992d4a32007-07-11 13:09:30 +00001271 assert(NCH(n) > 3);
1272 REQ(CHILD(n, 1), COLON);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001273
Guido van Rossum992d4a32007-07-11 13:09:30 +00001274 key = ast_for_expr(c, CHILD(n, 0));
1275 if (!key)
1276 return NULL;
1277
1278 value = ast_for_expr(c, CHILD(n, 2));
1279 if (!value)
1280 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001281
Guido van Rossum992d4a32007-07-11 13:09:30 +00001282 comps = ast_for_comprehension(c, CHILD(n, 3));
1283 if (!comps)
1284 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001285
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1287}
1288
1289static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001290ast_for_genexp(struct compiling *c, const node *n)
1291{
1292 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001294}
1295
1296static expr_ty
1297ast_for_listcomp(struct compiling *c, const node *n)
1298{
1299 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001300 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001301}
1302
1303static expr_ty
1304ast_for_setcomp(struct compiling *c, const node *n)
1305{
1306 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001307 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001308}
1309
1310
1311static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312ast_for_atom(struct compiling *c, const node *n)
1313{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001314 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1315 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001316 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 */
1318 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001319 int bytesmode = 0;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001320
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001322 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001323 /* All names start in Load context, but may later be
1324 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001325 PyObject *name = NEW_IDENTIFIER(ch);
1326 if (!name)
1327 return NULL;
1328 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001331 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001333 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001334 PyObject *type, *value, *tback, *errstr;
1335 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001336 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001337 if (errstr) {
1338 char *s = "";
1339 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001340 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001341 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1342 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001343 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001344 } else {
1345 ast_error(n, "(unicode error) unknown error");
1346 }
1347 Py_DECREF(type);
1348 Py_DECREF(value);
1349 Py_XDECREF(tback);
1350 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001354 if (bytesmode)
1355 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1356 else
1357 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 }
1359 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001360 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 if (!pynum)
1362 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001363
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 PyArena_AddPyObject(c->c_arena, pynum);
1365 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 }
Georg Brandldde00282007-03-18 19:01:53 +00001367 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001371
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 if (TYPE(ch) == RPAR)
1373 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001374
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 if (TYPE(ch) == yield_expr)
1376 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001377
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001378 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001379 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 return ast_for_genexp(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001381
Nick Coghlan650f0d02007-04-15 12:05:43 +00001382 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001385
Thomas Wouters89f507f2006-12-13 04:49:30 +00001386 if (TYPE(ch) == RSQB)
1387 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001388
Nick Coghlan650f0d02007-04-15 12:05:43 +00001389 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1391 asdl_seq *elts = seq_for_testlist(c, ch);
1392 if (!elts)
1393 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001394
Thomas Wouters89f507f2006-12-13 04:49:30 +00001395 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1396 }
1397 else
1398 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1401 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001402 int i, size;
1403 asdl_seq *keys, *values;
1404
1405 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001406 if (TYPE(ch) == RBRACE) {
1407 /* it's an empty dict */
1408 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1409 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1410 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001411 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001412 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001413 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001414 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001415 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001416 for (i = 0; i < NCH(ch); i += 2) {
1417 expr_ty expression;
1418 expression = ast_for_expr(c, CHILD(ch, i));
1419 if (!expression)
1420 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001422 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001423 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1424 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1425 /* it's a set comprehension */
1426 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001427 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1428 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001429 } else {
1430 /* it's a dict */
1431 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1432 keys = asdl_seq_new(size, c->c_arena);
1433 if (!keys)
1434 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001435
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 values = asdl_seq_new(size, c->c_arena);
1437 if (!values)
1438 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001439
Guido van Rossum86e58e22006-08-28 15:27:34 +00001440 for (i = 0; i < NCH(ch); i += 4) {
1441 expr_ty expression;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001442
Guido van Rossum86e58e22006-08-28 15:27:34 +00001443 expression = ast_for_expr(c, CHILD(ch, i));
1444 if (!expression)
1445 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001446
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001448
Guido van Rossum86e58e22006-08-28 15:27:34 +00001449 expression = ast_for_expr(c, CHILD(ch, i + 2));
1450 if (!expression)
1451 return NULL;
1452
1453 asdl_seq_SET(values, i / 4, expression);
1454 }
1455 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1456 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1460 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 }
1462}
1463
1464static slice_ty
1465ast_for_slice(struct compiling *c, const node *n)
1466{
1467 node *ch;
1468 expr_ty lower = NULL, upper = NULL, step = NULL;
1469
1470 REQ(n, subscript);
1471
1472 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001473 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 sliceop: ':' [test]
1475 */
1476 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (NCH(n) == 1 && TYPE(ch) == test) {
1478 /* 'step' variable hold no significance in terms of being used over
1479 other vars */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001480 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 if (!step)
1482 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001483
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486
1487 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!lower)
1490 return NULL;
1491 }
1492
1493 /* If there's an upper bound it's in the second or third position. */
1494 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (NCH(n) > 1) {
1496 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 if (TYPE(n2) == test) {
1499 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 if (!upper)
1501 return NULL;
1502 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
Thomas Wouters89f507f2006-12-13 04:49:30 +00001507 if (TYPE(n2) == test) {
1508 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!upper)
1510 return NULL;
1511 }
1512 }
1513
1514 ch = CHILD(n, NCH(n) - 1);
1515 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516 if (NCH(ch) == 1) {
1517 /* No expression, so step is None */
1518 ch = CHILD(ch, 0);
1519 step = Name(new_identifier("None", c->c_arena), Load,
1520 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!step)
1522 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001523 } else {
1524 ch = CHILD(ch, 1);
1525 if (TYPE(ch) == test) {
1526 step = ast_for_expr(c, ch);
1527 if (!step)
1528 return NULL;
1529 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 }
1531 }
1532
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001533 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
1536static expr_ty
1537ast_for_binop(struct compiling *c, const node *n)
1538{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 /* Must account for a sequence of expressions.
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001540 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 BinOp(BinOp(A, op, B), op, C).
1542 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 int i, nops;
1545 expr_ty expr1, expr2, result;
1546 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 expr1 = ast_for_expr(c, CHILD(n, 0));
1549 if (!expr1)
1550 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 expr2 = ast_for_expr(c, CHILD(n, 2));
1553 if (!expr2)
1554 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 newoperator = get_operator(CHILD(n, 1));
1557 if (!newoperator)
1558 return NULL;
1559
1560 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1561 c->c_arena);
1562 if (!result)
1563 return NULL;
1564
1565 nops = (NCH(n) - 1) / 2;
1566 for (i = 1; i < nops; i++) {
1567 expr_ty tmp_result, tmp;
1568 const node* next_oper = CHILD(n, i * 2 + 1);
1569
1570 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001571 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 return NULL;
1573
Guido van Rossumd8faa362007-04-27 19:54:29 +00001574 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1575 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 return NULL;
1577
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001578 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 LINENO(next_oper), next_oper->n_col_offset,
1580 c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001581 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582 return NULL;
1583 result = tmp_result;
1584 }
1585 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586}
1587
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001588static expr_ty
1589ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1590{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001591 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001592 subscriptlist: subscript (',' subscript)* [',']
1593 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1594 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595 REQ(n, trailer);
1596 if (TYPE(CHILD(n, 0)) == LPAR) {
1597 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1599 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001601 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001603 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001604 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1605 if (!attr_id)
1606 return NULL;
1607 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001608 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001609 }
1610 else {
1611 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 REQ(CHILD(n, 2), RSQB);
1613 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001615 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1616 if (!slc)
1617 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001618 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1619 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001620 }
1621 else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001622 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001623 by treating the sequence as a tuple literal if there are
1624 no slice features.
1625 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 int j;
1627 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001629 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001630 asdl_seq *slices, *elts;
1631 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001632 if (!slices)
1633 return NULL;
1634 for (j = 0; j < NCH(n); j += 2) {
1635 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001636 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001639 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 asdl_seq_SET(slices, j / 2, slc);
1641 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 if (!simple) {
1643 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001644 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001645 }
1646 /* extract Index values and put them in a Tuple */
1647 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001648 if (!elts)
1649 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001650 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1651 slc = (slice_ty)asdl_seq_GET(slices, j);
1652 assert(slc->kind == Index_kind && slc->v.Index.value);
1653 asdl_seq_SET(elts, j, slc->v.Index.value);
1654 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 if (!e)
1657 return NULL;
1658 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001659 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 }
1661 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001662}
1663
1664static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001665ast_for_factor(struct compiling *c, const node *n)
1666{
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001667 node *pfactor, *ppower, *patom, *pnum;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001668 expr_ty expression;
1669
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001670 /* If the unary - operator is applied to a constant, don't generate
1671 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1672 constant. The peephole optimizer already does something like
1673 this but it doesn't handle the case where the constant is
1674 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1675 PyLongObject.
1676 */
1677 if (TYPE(CHILD(n, 0)) == MINUS
1678 && NCH(n) == 2
1679 && TYPE((pfactor = CHILD(n, 1))) == factor
1680 && NCH(pfactor) == 1
1681 && TYPE((ppower = CHILD(pfactor, 0))) == power
1682 && NCH(ppower) == 1
1683 && TYPE((patom = CHILD(ppower, 0))) == atom
1684 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1685 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1686 if (s == NULL)
1687 return NULL;
1688 s[0] = '-';
1689 strcpy(s + 1, STR(pnum));
1690 PyObject_FREE(STR(pnum));
1691 STR(pnum) = s;
1692 return ast_for_atom(c, patom);
1693 }
1694
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001695 expression = ast_for_expr(c, CHILD(n, 1));
1696 if (!expression)
1697 return NULL;
1698
1699 switch (TYPE(CHILD(n, 0))) {
1700 case PLUS:
1701 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1702 c->c_arena);
1703 case MINUS:
1704 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1705 c->c_arena);
1706 case TILDE:
1707 return UnaryOp(Invert, expression, LINENO(n),
1708 n->n_col_offset, c->c_arena);
1709 }
1710 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1711 TYPE(CHILD(n, 0)));
1712 return NULL;
1713}
1714
1715static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001716ast_for_power(struct compiling *c, const node *n)
1717{
1718 /* power: atom trailer* ('**' factor)*
1719 */
1720 int i;
1721 expr_ty e, tmp;
1722 REQ(n, power);
1723 e = ast_for_atom(c, CHILD(n, 0));
1724 if (!e)
1725 return NULL;
1726 if (NCH(n) == 1)
1727 return e;
1728 for (i = 1; i < NCH(n); i++) {
1729 node *ch = CHILD(n, i);
1730 if (TYPE(ch) != trailer)
1731 break;
1732 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001733 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001734 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001735 tmp->lineno = e->lineno;
1736 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001737 e = tmp;
1738 }
1739 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1740 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001741 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001743 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001745 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001746 e = tmp;
1747 }
1748 return e;
1749}
1750
Guido van Rossum0368b722007-05-11 16:50:42 +00001751static expr_ty
1752ast_for_starred(struct compiling *c, const node *n)
1753{
1754 expr_ty tmp;
1755 REQ(n, star_expr);
1756
1757 tmp = ast_for_expr(c, CHILD(n, 1));
1758 if (!tmp)
1759 return NULL;
1760
1761 /* The Load context is changed later. */
1762 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1763}
1764
1765
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766/* Do not name a variable 'expr'! Will cause a compile error.
1767*/
1768
1769static expr_ty
1770ast_for_expr(struct compiling *c, const node *n)
1771{
1772 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001773 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001774 test_nocond: or_test | lambdef_nocond
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001775 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776 and_test: not_test ('and' not_test)*
1777 not_test: 'not' not_test | comparison
1778 comparison: expr (comp_op expr)*
1779 expr: xor_expr ('|' xor_expr)*
1780 xor_expr: and_expr ('^' and_expr)*
1781 and_expr: shift_expr ('&' shift_expr)*
1782 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1783 arith_expr: term (('+'|'-') term)*
1784 term: factor (('*'|'/'|'%'|'//') factor)*
1785 factor: ('+'|'-'|'~') factor | power
1786 power: atom trailer* ('**' factor)*
1787 */
1788
1789 asdl_seq *seq;
1790 int i;
1791
1792 loop:
1793 switch (TYPE(n)) {
1794 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001795 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001796 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001799 else if (NCH(n) > 1)
1800 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001801 /* Fallthrough */
1802 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 case and_test:
1804 if (NCH(n) == 1) {
1805 n = CHILD(n, 0);
1806 goto loop;
1807 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001808 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 if (!seq)
1810 return NULL;
1811 for (i = 0; i < NCH(n); i += 2) {
1812 expr_ty e = ast_for_expr(c, CHILD(n, i));
1813 if (!e)
1814 return NULL;
1815 asdl_seq_SET(seq, i / 2, e);
1816 }
1817 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001818 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1819 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001820 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001821 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 case not_test:
1823 if (NCH(n) == 1) {
1824 n = CHILD(n, 0);
1825 goto loop;
1826 }
1827 else {
1828 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1829 if (!expression)
1830 return NULL;
1831
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1833 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 }
1835 case comparison:
1836 if (NCH(n) == 1) {
1837 n = CHILD(n, 0);
1838 goto loop;
1839 }
1840 else {
1841 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001843 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 if (!ops)
1846 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001847 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 return NULL;
1850 }
1851 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001854 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858
1859 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001860 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001863
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001864 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 asdl_seq_SET(cmps, i / 2, expression);
1866 }
1867 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001868 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001871
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001872 return Compare(expression, ops, cmps, LINENO(n),
1873 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 }
1875 break;
1876
Guido van Rossum0368b722007-05-11 16:50:42 +00001877 case star_expr:
1878 if (TYPE(CHILD(n, 0)) == STAR) {
1879 return ast_for_starred(c, n);
1880 }
1881 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 /* The next five cases all handle BinOps. The main body of code
1883 is the same in each case, but the switch turned inside out to
1884 reuse the code for each type of operator.
1885 */
1886 case expr:
1887 case xor_expr:
1888 case and_expr:
1889 case shift_expr:
1890 case arith_expr:
1891 case term:
1892 if (NCH(n) == 1) {
1893 n = CHILD(n, 0);
1894 goto loop;
1895 }
1896 return ast_for_binop(c, n);
1897 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 expr_ty exp = NULL;
1899 if (NCH(n) == 2) {
1900 exp = ast_for_testlist(c, CHILD(n, 1));
1901 if (!exp)
1902 return NULL;
1903 }
1904 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1905 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001906 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (NCH(n) == 1) {
1908 n = CHILD(n, 0);
1909 goto loop;
1910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001912 case power:
1913 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001915 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 return NULL;
1917 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001918 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 return NULL;
1920}
1921
1922static expr_ty
1923ast_for_call(struct compiling *c, const node *n, expr_ty func)
1924{
1925 /*
1926 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1927 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 */
1930
1931 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001932 asdl_seq *args;
1933 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 expr_ty vararg = NULL, kwarg = NULL;
1935
1936 REQ(n, arglist);
1937
1938 nargs = 0;
1939 nkeywords = 0;
1940 ngens = 0;
1941 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 node *ch = CHILD(n, i);
1943 if (TYPE(ch) == argument) {
1944 if (NCH(ch) == 1)
1945 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 nkeywords++;
1950 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
1952 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001953 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 "if not sole argument");
1955 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 }
1957
1958 if (nargs + nkeywords + ngens > 255) {
1959 ast_error(n, "more than 255 arguments");
1960 return NULL;
1961 }
1962
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 return NULL;
1966 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001968 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 nargs = 0;
1970 nkeywords = 0;
1971 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 node *ch = CHILD(n, i);
1973 if (TYPE(ch) == argument) {
1974 expr_ty e;
1975 if (NCH(ch) == 1) {
1976 if (nkeywords) {
1977 ast_error(CHILD(ch, 0),
1978 "non-keyword arg after keyword arg");
1979 return NULL;
1980 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001981 if (vararg) {
1982 ast_error(CHILD(ch, 0),
1983 "only named arguments may follow *expression");
1984 return NULL;
1985 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 asdl_seq_SET(args, nargs++, e);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001990 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001991 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001994 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 else {
1998 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001999 identifier key, tmp;
2000 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002002 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 /* f(lambda x: x[0] = 3) ends up getting parsed with
2007 * LHS test = lambda x: x[0], and RHS test = 3.
2008 * SF bug 132313 points out that complaining about a keyword
2009 * then is very confusing.
2010 */
2011 if (e->kind == Lambda_kind) {
2012 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 } else if (e->kind != Name_kind) {
2015 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002017 } else if (forbidden_name(e, ch)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002021 for (k = 0; k < nkeywords; k++) {
2022 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2023 if (!PyUnicode_Compare(tmp, key)) {
2024 ast_error(CHILD(ch, 0), "keyword argument repeated");
2025 return NULL;
2026 }
2027 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002033 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 asdl_seq_SET(keywords, nkeywords++, kw);
2035 }
2036 }
2037 else if (TYPE(ch) == STAR) {
2038 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002039 if (!vararg)
2040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 i++;
2042 }
2043 else if (TYPE(ch) == DOUBLESTAR) {
2044 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002045 if (!kwarg)
2046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 i++;
2048 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 }
2050
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002051 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002057 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002059 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002061 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002063 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002064 }
2065 else {
2066 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002067 TYPE(n) == testlist1);
2068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002070 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 else {
2072 asdl_seq *tmp = seq_for_testlist(c, n);
2073 if (!tmp)
2074 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002077}
2078
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079static stmt_ty
2080ast_for_expr_stmt(struct compiling *c, const node *n)
2081{
2082 REQ(n, expr_stmt);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002083 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 | ('=' (yield_expr|testlist))*)
2085 testlist: test (',' test)* [',']
2086 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 test: ... here starts the operator precendence dance
2089 */
2090
2091 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002092 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 if (!e)
2094 return NULL;
2095
Thomas Wouters89f507f2006-12-13 04:49:30 +00002096 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 }
2098 else if (TYPE(CHILD(n, 1)) == augassign) {
2099 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002100 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (!expr1)
2105 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002106 if(!set_context(c, expr1, Store, ch))
2107 return NULL;
Benjamin Peterson4fac7062009-10-03 20:28:47 +00002108 /* set_context checks that most expressions are not the left side.
2109 Augmented assignments can only have a name, a subscript, or an
2110 attribute on the left, though, so we have to explicitly check for
2111 those. */
2112 switch (expr1->kind) {
2113 case Name_kind:
2114 case Attribute_kind:
2115 case Subscript_kind:
2116 break;
2117 default:
2118 ast_error(ch, "illegal expression for augmented assignment");
2119 return NULL;
2120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121
Thomas Wouters89f507f2006-12-13 04:49:30 +00002122 ch = CHILD(n, 2);
2123 if (TYPE(ch) == testlist)
2124 expr2 = ast_for_testlist(c, ch);
2125 else
2126 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002127 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 return NULL;
2129
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002130 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002131 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 return NULL;
2133
Thomas Wouters89f507f2006-12-13 04:49:30 +00002134 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 }
2136 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 int i;
2138 asdl_seq *targets;
2139 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 expr_ty expression;
2141
Thomas Wouters89f507f2006-12-13 04:49:30 +00002142 /* a normal assignment */
2143 REQ(CHILD(n, 1), EQUAL);
2144 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2145 if (!targets)
2146 return NULL;
2147 for (i = 0; i < NCH(n) - 2; i += 2) {
2148 expr_ty e;
2149 node *ch = CHILD(n, i);
2150 if (TYPE(ch) == yield_expr) {
2151 ast_error(ch, "assignment to yield expression not possible");
2152 return NULL;
2153 }
2154 e = ast_for_testlist(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002155 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002156 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002158 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002159 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161
Thomas Wouters89f507f2006-12-13 04:49:30 +00002162 asdl_seq_SET(targets, i / 2, e);
2163 }
2164 value = CHILD(n, NCH(n) - 1);
2165 if (TYPE(value) == testlist)
2166 expression = ast_for_testlist(c, value);
2167 else
2168 expression = ast_for_expr(c, value);
2169 if (!expression)
2170 return NULL;
2171 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173}
2174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002176ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177{
2178 asdl_seq *seq;
2179 int i;
2180 expr_ty e;
2181
2182 REQ(n, exprlist);
2183
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002184 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 e = ast_for_expr(c, CHILD(n, i));
2189 if (!e)
2190 return NULL;
2191 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002192 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 }
2195 return seq;
2196}
2197
2198static stmt_ty
2199ast_for_del_stmt(struct compiling *c, const node *n)
2200{
2201 asdl_seq *expr_list;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 /* del_stmt: 'del' exprlist */
2204 REQ(n, del_stmt);
2205
2206 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2207 if (!expr_list)
2208 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002209 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210}
2211
2212static stmt_ty
2213ast_for_flow_stmt(struct compiling *c, const node *n)
2214{
2215 /*
2216 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2217 | yield_stmt
2218 break_stmt: 'break'
2219 continue_stmt: 'continue'
2220 return_stmt: 'return' [testlist]
2221 yield_stmt: yield_expr
2222 yield_expr: 'yield' testlist
2223 raise_stmt: 'raise' [test [',' test [',' test]]]
2224 */
2225 node *ch;
2226
2227 REQ(n, flow_stmt);
2228 ch = CHILD(n, 0);
2229 switch (TYPE(ch)) {
2230 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002231 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002235 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2236 if (!exp)
2237 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 }
2240 case return_stmt:
2241 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002244 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 if (!expression)
2246 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002247 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 case raise_stmt:
2250 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002251 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2252 else if (NCH(ch) >= 2) {
2253 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2255 if (!expression)
2256 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002257 if (NCH(ch) == 4) {
2258 cause = ast_for_expr(c, CHILD(ch, 3));
2259 if (!cause)
2260 return NULL;
2261 }
2262 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 }
2264 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002265 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 "unexpected flow_stmt: %d", TYPE(ch));
2267 return NULL;
2268 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002269
2270 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272}
2273
2274static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002275alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276{
2277 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002278 import_as_name: NAME ['as' NAME]
2279 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 dotted_name: NAME ('.' NAME)*
2281 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002282 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002283
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 loop:
2285 switch (TYPE(n)) {
2286 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002287 str = NULL;
2288 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002289 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002290 if (!str)
2291 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002292 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002293 name = NEW_IDENTIFIER(CHILD(n, 0));
2294 if (!name)
2295 return NULL;
2296 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 case dotted_as_name:
2298 if (NCH(n) == 1) {
2299 n = CHILD(n, 0);
2300 goto loop;
2301 }
2302 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002303 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002304 if (!a)
2305 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 assert(!a->asname);
2307 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002308 if (!a->asname)
2309 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310 return a;
2311 }
2312 break;
2313 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002314 if (NCH(n) == 1) {
2315 name = NEW_IDENTIFIER(CHILD(n, 0));
2316 if (!name)
2317 return NULL;
2318 return alias(name, NULL, c->c_arena);
2319 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 else {
2321 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002322 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002323 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 char *s;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002325 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326
2327 len = 0;
2328 for (i = 0; i < NCH(n); i += 2)
2329 /* length of string plus one for the dot */
2330 len += strlen(STR(CHILD(n, i))) + 1;
2331 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002332 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 if (!str)
2334 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002335 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 if (!s)
2337 return NULL;
2338 for (i = 0; i < NCH(n); i += 2) {
2339 char *sch = STR(CHILD(n, i));
2340 strcpy(s, STR(CHILD(n, i)));
2341 s += strlen(sch);
2342 *s++ = '.';
2343 }
2344 --s;
2345 *s = '\0';
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002346 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2347 PyBytes_GET_SIZE(str),
2348 NULL);
2349 Py_DECREF(str);
2350 if (!uni)
2351 return NULL;
2352 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002353 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002355 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 }
2357 break;
2358 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002359 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002360 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002361 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002363 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 "unexpected import name: %d", TYPE(n));
2365 return NULL;
2366 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002367
2368 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return NULL;
2370}
2371
2372static stmt_ty
2373ast_for_import_stmt(struct compiling *c, const node *n)
2374{
2375 /*
2376 import_stmt: import_name | import_from
2377 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002378 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2379 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002381 int lineno;
2382 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 int i;
2384 asdl_seq *aliases;
2385
2386 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002387 lineno = LINENO(n);
2388 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002390 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002392 REQ(n, dotted_as_names);
2393 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2394 if (!aliases)
2395 return NULL;
2396 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002397 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002400 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002404 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 int idx, ndots = 0;
2407 alias_ty mod = NULL;
2408 identifier modname;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002409
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002410 /* Count the number of dots (for relative imports) and check for the
2411 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 for (idx = 1; idx < NCH(n); idx++) {
2413 if (TYPE(CHILD(n, idx)) == dotted_name) {
2414 mod = alias_for_import_name(c, CHILD(n, idx));
2415 idx++;
2416 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002417 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002418 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002419 ndots += 3;
2420 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 } else if (TYPE(CHILD(n, idx)) != DOT) {
2422 break;
2423 }
2424 ndots++;
2425 }
2426 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002427 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002428 case STAR:
2429 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 n = CHILD(n, idx);
2431 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 break;
2433 case LPAR:
2434 /* from ... import (x, y, z) */
2435 n = CHILD(n, idx + 1);
2436 n_children = NCH(n);
2437 break;
2438 case import_as_names:
2439 /* from ... import x, y, z */
2440 n = CHILD(n, idx);
2441 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002442 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 ast_error(n, "trailing comma not allowed without"
2444 " surrounding parentheses");
2445 return NULL;
2446 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 break;
2448 default:
2449 ast_error(n, "Unexpected node-type in from-import");
2450 return NULL;
2451 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2454 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456
2457 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002458 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002459 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002460 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002464 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002465 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002466 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2467 if (!import_alias)
2468 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002469 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002472 if (mod != NULL)
2473 modname = mod->name;
2474 else
2475 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002476 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002477 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
Neal Norwitz79792652005-11-14 04:25:03 +00002479 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 "unknown import statement: starts with command '%s'",
2481 STR(CHILD(n, 0)));
2482 return NULL;
2483}
2484
2485static stmt_ty
2486ast_for_global_stmt(struct compiling *c, const node *n)
2487{
2488 /* global_stmt: 'global' NAME (',' NAME)* */
2489 identifier name;
2490 asdl_seq *s;
2491 int i;
2492
2493 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 name = NEW_IDENTIFIER(CHILD(n, i));
2499 if (!name)
2500 return NULL;
2501 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002503 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504}
2505
2506static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002507ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2508{
2509 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2510 identifier name;
2511 asdl_seq *s;
2512 int i;
2513
2514 REQ(n, nonlocal_stmt);
2515 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2516 if (!s)
2517 return NULL;
2518 for (i = 1; i < NCH(n); i += 2) {
2519 name = NEW_IDENTIFIER(CHILD(n, i));
2520 if (!name)
2521 return NULL;
2522 asdl_seq_SET(s, i / 2, name);
2523 }
2524 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2525}
2526
2527static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528ast_for_assert_stmt(struct compiling *c, const node *n)
2529{
2530 /* assert_stmt: 'assert' test [',' test] */
2531 REQ(n, assert_stmt);
2532 if (NCH(n) == 2) {
2533 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2534 if (!expression)
2535 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002536 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
2538 else if (NCH(n) == 4) {
2539 expr_ty expr1, expr2;
2540
2541 expr1 = ast_for_expr(c, CHILD(n, 1));
2542 if (!expr1)
2543 return NULL;
2544 expr2 = ast_for_expr(c, CHILD(n, 3));
2545 if (!expr2)
2546 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002547
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 }
Neal Norwitz79792652005-11-14 04:25:03 +00002550 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 "improper number of parts to 'assert' statement: %d",
2552 NCH(n));
2553 return NULL;
2554}
2555
2556static asdl_seq *
2557ast_for_suite(struct compiling *c, const node *n)
2558{
2559 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002560 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 stmt_ty s;
2562 int i, total, num, end, pos = 0;
2563 node *ch;
2564
2565 REQ(n, suite);
2566
2567 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002568 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 n = CHILD(n, 0);
2573 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002574 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002575 */
2576 end = NCH(n) - 1;
2577 if (TYPE(CHILD(n, end - 1)) == SEMI)
2578 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 for (i = 0; i < end; i += 2) {
2581 ch = CHILD(n, i);
2582 s = ast_for_stmt(c, ch);
2583 if (!s)
2584 return NULL;
2585 asdl_seq_SET(seq, pos++, s);
2586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 }
2588 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 for (i = 2; i < (NCH(n) - 1); i++) {
2590 ch = CHILD(n, i);
2591 REQ(ch, stmt);
2592 num = num_stmts(ch);
2593 if (num == 1) {
2594 /* small_stmt or compound_stmt with only one child */
2595 s = ast_for_stmt(c, ch);
2596 if (!s)
2597 return NULL;
2598 asdl_seq_SET(seq, pos++, s);
2599 }
2600 else {
2601 int j;
2602 ch = CHILD(ch, 0);
2603 REQ(ch, simple_stmt);
2604 for (j = 0; j < NCH(ch); j += 2) {
2605 /* statement terminates with a semi-colon ';' */
2606 if (NCH(CHILD(ch, j)) == 0) {
2607 assert((j + 1) == NCH(ch));
2608 break;
2609 }
2610 s = ast_for_stmt(c, CHILD(ch, j));
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 }
2616 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
2618 assert(pos == seq->size);
2619 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620}
2621
2622static stmt_ty
2623ast_for_if_stmt(struct compiling *c, const node *n)
2624{
2625 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2626 ['else' ':' suite]
2627 */
2628 char *s;
2629
2630 REQ(n, if_stmt);
2631
2632 if (NCH(n) == 4) {
2633 expr_ty expression;
2634 asdl_seq *suite_seq;
2635
2636 expression = ast_for_expr(c, CHILD(n, 1));
2637 if (!expression)
2638 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002639 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002640 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002642
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2644 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002646
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 s = STR(CHILD(n, 4));
2648 /* s[2], the third character in the string, will be
2649 's' for el_s_e, or
2650 'i' for el_i_f
2651 */
2652 if (s[2] == 's') {
2653 expr_ty expression;
2654 asdl_seq *seq1, *seq2;
2655
2656 expression = ast_for_expr(c, CHILD(n, 1));
2657 if (!expression)
2658 return NULL;
2659 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002660 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 return NULL;
2662 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 return NULL;
2665
Guido van Rossumd8faa362007-04-27 19:54:29 +00002666 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2667 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 }
2669 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 expr_ty expression;
2672 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 asdl_seq *orelse = NULL;
2674 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 /* must reference the child n_elif+1 since 'else' token is third,
2676 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2678 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2679 has_else = 1;
2680 n_elif -= 3;
2681 }
2682 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002685 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 orelse = asdl_seq_new(1, c->c_arena);
2688 if (!orelse)
2689 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002693 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2694 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002696 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2697 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002700 asdl_seq_SET(orelse, 0,
2701 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 LINENO(CHILD(n, NCH(n) - 6)),
2703 CHILD(n, NCH(n) - 6)->n_col_offset,
2704 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 /* the just-created orelse handled the last elif */
2706 n_elif--;
2707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 for (i = 0; i < n_elif; i++) {
2710 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2712 if (!newobj)
2713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002715 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002718 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 asdl_seq_SET(newobj, 0,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002722 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002723 LINENO(CHILD(n, off)),
2724 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 orelse = newobj;
2726 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002727 expression = ast_for_expr(c, CHILD(n, 1));
2728 if (!expression)
2729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, 3));
2731 if (!suite_seq)
2732 return NULL;
2733 return If(expression, suite_seq, orelse,
2734 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736
2737 PyErr_Format(PyExc_SystemError,
2738 "unexpected token in 'if' statement: %s", s);
2739 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740}
2741
2742static stmt_ty
2743ast_for_while_stmt(struct compiling *c, const node *n)
2744{
2745 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2746 REQ(n, while_stmt);
2747
2748 if (NCH(n) == 4) {
2749 expr_ty expression;
2750 asdl_seq *suite_seq;
2751
2752 expression = ast_for_expr(c, CHILD(n, 1));
2753 if (!expression)
2754 return NULL;
2755 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002756 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 }
2760 else if (NCH(n) == 7) {
2761 expr_ty expression;
2762 asdl_seq *seq1, *seq2;
2763
2764 expression = ast_for_expr(c, CHILD(n, 1));
2765 if (!expression)
2766 return NULL;
2767 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 return NULL;
2770 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
2773
Thomas Wouters89f507f2006-12-13 04:49:30 +00002774 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776
2777 PyErr_Format(PyExc_SystemError,
2778 "wrong number of tokens for 'while' statement: %d",
2779 NCH(n));
2780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781}
2782
2783static stmt_ty
2784ast_for_for_stmt(struct compiling *c, const node *n)
2785{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 expr_ty expression;
2788 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002789 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2791 REQ(n, for_stmt);
2792
2793 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002794 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 if (!seq)
2796 return NULL;
2797 }
2798
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002799 node_target = CHILD(n, 1);
2800 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002803 /* Check the # of children rather than the length of _target, since
2804 for x, in ... has 1 element in _target, but still requires a Tuple. */
2805 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002806 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002808 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002810 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002811 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
2813 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002814 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 return NULL;
2816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002817 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2818 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819}
2820
2821static excepthandler_ty
2822ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2823{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002824 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 REQ(exc, except_clause);
2826 REQ(body, suite);
2827
2828 if (NCH(exc) == 1) {
2829 asdl_seq *suite_seq = ast_for_suite(c, body);
2830 if (!suite_seq)
2831 return NULL;
2832
Neal Norwitzad74aa82008-03-31 05:14:30 +00002833 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 }
2836 else if (NCH(exc) == 2) {
2837 expr_ty expression;
2838 asdl_seq *suite_seq;
2839
2840 expression = ast_for_expr(c, CHILD(exc, 1));
2841 if (!expression)
2842 return NULL;
2843 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002844 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 return NULL;
2846
Neal Norwitzad74aa82008-03-31 05:14:30 +00002847 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002848 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
2850 else if (NCH(exc) == 4) {
2851 asdl_seq *suite_seq;
2852 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002853 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002857 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 return NULL;
2859 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862
Neal Norwitzad74aa82008-03-31 05:14:30 +00002863 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002864 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002866
2867 PyErr_Format(PyExc_SystemError,
2868 "wrong number of children for 'except' clause: %d",
2869 NCH(exc));
2870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871}
2872
2873static stmt_ty
2874ast_for_try_stmt(struct compiling *c, const node *n)
2875{
Neal Norwitzf599f422005-12-17 21:33:47 +00002876 const int nch = NCH(n);
2877 int n_except = (nch - 3)/3;
2878 asdl_seq *body, *orelse = NULL, *finally = NULL;
2879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 REQ(n, try_stmt);
2881
Neal Norwitzf599f422005-12-17 21:33:47 +00002882 body = ast_for_suite(c, CHILD(n, 2));
2883 if (body == NULL)
2884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885
Neal Norwitzf599f422005-12-17 21:33:47 +00002886 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2887 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2888 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2889 /* we can assume it's an "else",
2890 because nch >= 9 for try-else-finally and
2891 it would otherwise have a type of except_clause */
2892 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2893 if (orelse == NULL)
2894 return NULL;
2895 n_except--;
2896 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897
Neal Norwitzf599f422005-12-17 21:33:47 +00002898 finally = ast_for_suite(c, CHILD(n, nch - 1));
2899 if (finally == NULL)
2900 return NULL;
2901 n_except--;
2902 }
2903 else {
2904 /* we can assume it's an "else",
2905 otherwise it would have a type of except_clause */
2906 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2907 if (orelse == NULL)
2908 return NULL;
2909 n_except--;
2910 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002912 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002913 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 return NULL;
2915 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002916
Neal Norwitzf599f422005-12-17 21:33:47 +00002917 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 int i;
2919 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 /* process except statements to create a try ... except */
2921 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2922 if (handlers == NULL)
2923 return NULL;
2924
2925 for (i = 0; i < n_except; i++) {
2926 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2927 CHILD(n, 5 + i * 3));
2928 if (!e)
2929 return NULL;
2930 asdl_seq_SET(handlers, i, e);
2931 }
2932
Thomas Wouters89f507f2006-12-13 04:49:30 +00002933 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002934 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002935 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002937
2938 /* if a 'finally' is present too, we nest the TryExcept within a
2939 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 body = asdl_seq_new(1, c->c_arena);
2941 if (body == NULL)
2942 return NULL;
2943 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002944 }
2945
2946 /* must be a try ... finally (except clauses are in body, if any exist) */
2947 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002948 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949}
2950
Georg Brandl0c315622009-05-25 21:10:36 +00002951/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002952static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002953ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002954{
2955 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002956
Georg Brandl0c315622009-05-25 21:10:36 +00002957 REQ(n, with_item);
2958 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002959 if (!context_expr)
2960 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002961 if (NCH(n) == 3) {
2962 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963
2964 if (!optional_vars) {
2965 return NULL;
2966 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002967 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002968 return NULL;
2969 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002970 }
2971
Georg Brandl0c315622009-05-25 21:10:36 +00002972 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002973 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974}
2975
Georg Brandl0c315622009-05-25 21:10:36 +00002976/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2977static stmt_ty
2978ast_for_with_stmt(struct compiling *c, const node *n)
2979{
2980 int i;
2981 stmt_ty ret;
2982 asdl_seq *inner;
2983
2984 REQ(n, with_stmt);
2985
2986 /* process the with items inside-out */
2987 i = NCH(n) - 1;
2988 /* the suite of the innermost with item is the suite of the with stmt */
2989 inner = ast_for_suite(c, CHILD(n, i));
2990 if (!inner)
2991 return NULL;
2992
2993 for (;;) {
2994 i -= 2;
2995 ret = ast_for_with_item(c, CHILD(n, i), inner);
2996 if (!ret)
2997 return NULL;
2998 /* was this the last item? */
2999 if (i == 1)
3000 break;
3001 /* if not, wrap the result so far in a new sequence */
3002 inner = asdl_seq_new(1, c->c_arena);
3003 if (!inner)
3004 return NULL;
3005 asdl_seq_SET(inner, 0, ret);
3006 }
3007
3008 return ret;
3009}
3010
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003012ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003014 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003015 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003016 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003017 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003018
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 REQ(n, classdef);
3020
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003021 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 s = ast_for_suite(c, CHILD(n, 3));
3023 if (!s)
3024 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003025 classname = NEW_IDENTIFIER(CHILD(n, 1));
3026 if (!classname)
3027 return NULL;
3028 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3029 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031
3032 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003033 s = ast_for_suite(c, CHILD(n,5));
3034 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003035 return NULL;
3036 classname = NEW_IDENTIFIER(CHILD(n, 1));
3037 if (!classname)
3038 return NULL;
3039 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3040 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 }
3042
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003043 /* class NAME '(' arglist ')' ':' suite */
3044 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003045 {
3046 PyObject *dummy_name;
3047 expr_ty dummy;
3048 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3049 if (!dummy_name)
3050 return NULL;
3051 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3052 call = ast_for_call(c, CHILD(n, 3), dummy);
3053 if (!call)
3054 return NULL;
3055 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003057 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003059 classname = NEW_IDENTIFIER(CHILD(n, 1));
3060 if (!classname)
3061 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003062
Benjamin Peterson30760062008-11-25 04:02:28 +00003063 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003064 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003065 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066}
3067
3068static stmt_ty
3069ast_for_stmt(struct compiling *c, const node *n)
3070{
3071 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003072 assert(NCH(n) == 1);
3073 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 }
3075 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003076 assert(num_stmts(n) == 1);
3077 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 }
3079 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003080 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003081 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3082 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 */
3084 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 case expr_stmt:
3086 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087 case del_stmt:
3088 return ast_for_del_stmt(c, n);
3089 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003090 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003091 case flow_stmt:
3092 return ast_for_flow_stmt(c, n);
3093 case import_stmt:
3094 return ast_for_import_stmt(c, n);
3095 case global_stmt:
3096 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003097 case nonlocal_stmt:
3098 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099 case assert_stmt:
3100 return ast_for_assert_stmt(c, n);
3101 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003102 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3104 TYPE(n), NCH(n));
3105 return NULL;
3106 }
3107 }
3108 else {
3109 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003110 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003111 */
3112 node *ch = CHILD(n, 0);
3113 REQ(n, compound_stmt);
3114 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115 case if_stmt:
3116 return ast_for_if_stmt(c, ch);
3117 case while_stmt:
3118 return ast_for_while_stmt(c, ch);
3119 case for_stmt:
3120 return ast_for_for_stmt(c, ch);
3121 case try_stmt:
3122 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003123 case with_stmt:
3124 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003126 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003128 return ast_for_classdef(c, ch, NULL);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003129 case decorated:
3130 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003132 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3134 TYPE(n), NCH(n));
3135 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003136 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 }
3138}
3139
3140static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003141parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003143 const char *end;
3144 long x;
3145 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003147 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003148 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149#endif
3150
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003151 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 errno = 0;
3153 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 if (s[0] == '0') {
3158 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3159 if (x < 0 && errno == 0) {
3160 return PyLong_FromString((char *)s,
3161 (char **)0,
3162 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003163 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 }
3165 else
3166 x = PyOS_strtol((char *)s, (char **)&end, 0);
3167 if (*end == '\0') {
3168 if (errno != 0)
3169 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003170 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 }
3172 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003173#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003175 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003176 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3177 if (compl.imag == -1.0 && PyErr_Occurred())
3178 return NULL;
3179 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 }
3181 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003183 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003184 dx = PyOS_string_to_double(s, NULL, NULL);
3185 if (dx == -1.0 && PyErr_Occurred())
3186 return NULL;
3187 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189}
3190
3191static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003192decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 PyObject *u, *v;
3195 char *s, *t;
3196 t = s = (char *)*sPtr;
3197 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3198 while (s < end && (*s & 0x80)) s++;
3199 *sPtr = s;
3200 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3201 if (u == NULL)
3202 return NULL;
3203 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3204 Py_DECREF(u);
3205 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206}
3207
3208static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003209decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 PyObject *v, *u;
3212 char *buf;
3213 char *p;
3214 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003215
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 if (encoding == NULL) {
3217 buf = (char *)s;
3218 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003219 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003220 /* check for integer overflow */
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003221 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003222 return NULL;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003223 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3224 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3225 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 if (u == NULL)
3227 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003228 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 end = s + len;
3230 while (s < end) {
3231 if (*s == '\\') {
3232 *p++ = *s++;
3233 if (*s & 0x80) {
3234 strcpy(p, "u005c");
3235 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003236 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 }
3238 if (*s & 0x80) { /* XXX inefficient */
3239 PyObject *w;
3240 char *r;
3241 Py_ssize_t rn, i;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003242 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 if (w == NULL) {
3244 Py_DECREF(u);
3245 return NULL;
3246 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003247 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003248 rn = Py_SIZE(w);
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003249 assert(rn % 4 == 0);
3250 for (i = 0; i < rn; i += 4) {
3251 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003252 r[i + 0] & 0xFF,
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003253 r[i + 1] & 0xFF,
3254 r[i + 2] & 0xFF,
3255 r[i + 3] & 0xFF);
3256 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 }
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003258 /* Should be impossible to overflow */
3259 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260 Py_DECREF(w);
3261 } else {
3262 *p++ = *s++;
3263 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003264 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 len = p - buf;
3266 s = buf;
3267 }
3268 if (rawmode)
3269 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3270 else
3271 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3272 Py_XDECREF(u);
3273 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003274}
3275
3276/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003277 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 * parsestr parses it, and returns the decoded Python string object.
3279 */
3280static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003281parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003283 size_t len;
3284 const char *s = STR(n);
3285 int quote = Py_CHARMASK(*s);
3286 int rawmode = 0;
3287 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003288 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003289 if (quote == 'b' || quote == 'B') {
3290 quote = *++s;
3291 *bytesmode = 1;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003292 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 if (quote == 'r' || quote == 'R') {
3294 quote = *++s;
3295 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003296 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 }
3298 if (quote != '\'' && quote != '\"') {
3299 PyErr_BadInternalCall();
3300 return NULL;
3301 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003302 s++;
3303 len = strlen(s);
3304 if (len > INT_MAX) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003305 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 "string to parse is too long");
3307 return NULL;
3308 }
3309 if (s[--len] != quote) {
3310 PyErr_BadInternalCall();
3311 return NULL;
3312 }
3313 if (len >= 4 && s[0] == quote && s[1] == quote) {
3314 s += 2;
3315 len -= 2;
3316 if (s[--len] != quote || s[--len] != quote) {
3317 PyErr_BadInternalCall();
3318 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003319 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003320 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003321 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003322 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003323 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003324 if (*bytesmode) {
3325 /* Disallow non-ascii characters (but not escapes) */
3326 const char *c;
3327 for (c = s; *c; c++) {
3328 if (Py_CHARMASK(*c) >= 0x80) {
3329 ast_error(n, "bytes can only contain ASCII "
3330 "literal characters.");
3331 return NULL;
3332 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003333 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003334 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003335 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003336 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 if (rawmode || strchr(s, '\\') == NULL) {
3338 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003339 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003340 if (u == NULL || !*bytesmode)
3341 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003342 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003343 Py_DECREF(u);
3344 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003345 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003346 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003347 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003348 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003349 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003350 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003351 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003352 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003353 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003354 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003355}
3356
Guido van Rossum29fd7122007-11-12 01:13:56 +00003357/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358 * compile-time literal catenation, calling parsestr() on each piece, and
3359 * pasting the intermediate results together.
3360 */
3361static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003362parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003363{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003364 PyObject *v;
3365 int i;
3366 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003367 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003368 if (v != NULL) {
3369 /* String literal concatenation */
3370 for (i = 1; i < NCH(n); i++) {
3371 PyObject *s;
3372 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003373 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003374 if (s == NULL)
3375 goto onError;
3376 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003377 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003378 goto onError;
3379 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003380 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3381 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003382 if (v == NULL)
3383 goto onError;
3384 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003385 else {
3386 PyObject *temp = PyUnicode_Concat(v, s);
3387 Py_DECREF(s);
3388 Py_DECREF(v);
3389 v = temp;
3390 if (v == NULL)
3391 goto onError;
3392 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003393 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003394 }
3395 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003396
Guido van Rossumd8faa362007-04-27 19:54:29 +00003397 onError:
3398 Py_XDECREF(v);
3399 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003400}