blob: d97e9518ce539b9e634dc9b37ec5c20c21e1e9bf [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;
Victor Stinner15244f72010-10-19 01:22:07 +0000105 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000106 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 assert(PyErr_Occurred());
109 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111
112 PyErr_Fetch(&type, &value, &tback);
113 errstr = PyTuple_GetItem(value, 0);
114 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000117 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000118 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000119 Py_DECREF(errstr);
120 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122 Py_DECREF(value);
123
124 loc = PyErr_ProgramText(filename, lineno);
125 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000126 Py_INCREF(Py_None);
127 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128 }
Victor Stinner15244f72010-10-19 01:22:07 +0000129 if (filename != NULL)
130 filename_obj = PyUnicode_DecodeFSDefault(filename);
131 else {
132 Py_INCREF(Py_None);
133 filename_obj = Py_None;
134 }
135 if (filename_obj != NULL)
136 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, Py_None, loc);
137 else
138 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000140 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000141 Py_DECREF(errstr);
142 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000143 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000144 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145 Py_DECREF(errstr);
146 Py_DECREF(tmp);
147 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000148 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 PyErr_Restore(type, value, tback);
150}
151
152/* num_stmts() returns number of contained statements.
153
154 Use this routine to determine how big a sequence is needed for
155 the statements in a parse tree. Its raison d'etre is this bit of
156 grammar:
157
158 stmt: simple_stmt | compound_stmt
159 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
160
161 A simple_stmt can contain multiple small_stmt elements joined
162 by semicolons. If the arg is a simple_stmt, the number of
163 small_stmt elements is returned.
164*/
165
166static int
167num_stmts(const node *n)
168{
169 int i, l;
170 node *ch;
171
172 switch (TYPE(n)) {
173 case single_input:
174 if (TYPE(CHILD(n, 0)) == NEWLINE)
175 return 0;
176 else
177 return num_stmts(CHILD(n, 0));
178 case file_input:
179 l = 0;
180 for (i = 0; i < NCH(n); i++) {
181 ch = CHILD(n, i);
182 if (TYPE(ch) == stmt)
183 l += num_stmts(ch);
184 }
185 return l;
186 case stmt:
187 return num_stmts(CHILD(n, 0));
188 case compound_stmt:
189 return 1;
190 case simple_stmt:
191 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
192 case suite:
193 if (NCH(n) == 1)
194 return num_stmts(CHILD(n, 0));
195 else {
196 l = 0;
197 for (i = 2; i < (NCH(n) - 1); i++)
198 l += num_stmts(CHILD(n, i));
199 return l;
200 }
201 default: {
202 char buf[128];
203
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000204 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 TYPE(n), NCH(n));
206 Py_FatalError(buf);
207 }
208 }
209 assert(0);
210 return 0;
211}
212
213/* Transform the CST rooted at node * to the appropriate AST
214*/
215
216mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
218 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000220 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221 asdl_seq *stmts = NULL;
222 stmt_ty s;
223 node *ch;
224 struct compiling c;
225
226 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000227 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000228 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000229#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000230 ast_error(n, "encoding declaration in Unicode string");
231 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000232#endif
233 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 } else if (TYPE(n) == encoding_decl) {
236 c.c_encoding = STR(n);
237 n = CHILD(n, 0);
238 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000239 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000240 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000243 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244
Jeremy Hyltona8293132006-02-28 17:58:27 +0000245 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 switch (TYPE(n)) {
247 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000248 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000250 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 for (i = 0; i < NCH(n) - 1; i++) {
252 ch = CHILD(n, i);
253 if (TYPE(ch) == NEWLINE)
254 continue;
255 REQ(ch, stmt);
256 num = num_stmts(ch);
257 if (num == 1) {
258 s = ast_for_stmt(&c, ch);
259 if (!s)
260 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000261 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 }
263 else {
264 ch = CHILD(ch, 0);
265 REQ(ch, simple_stmt);
266 for (j = 0; j < num; j++) {
267 s = ast_for_stmt(&c, CHILD(ch, j * 2));
268 if (!s)
269 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000270 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 }
272 }
273 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000274 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 case eval_input: {
276 expr_ty testlist_ast;
277
Nick Coghlan650f0d02007-04-15 12:05:43 +0000278 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000279 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 if (!testlist_ast)
281 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000282 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 case single_input:
285 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000288 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
290 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000291 if (!asdl_seq_GET(stmts, 0))
292 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000293 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 }
295 else {
296 n = CHILD(n, 0);
297 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000298 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000300 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000302 s = ast_for_stmt(&c, n);
303 if (!s)
304 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 asdl_seq_SET(stmts, 0, s);
306 }
307 else {
308 /* Only a simple_stmt can contain multiple statements. */
309 REQ(n, simple_stmt);
310 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 if (TYPE(CHILD(n, i)) == NEWLINE)
312 break;
313 s = ast_for_stmt(&c, CHILD(n, i));
314 if (!s)
315 goto error;
316 asdl_seq_SET(stmts, i / 2, s);
317 }
318 }
319
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000320 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 }
322 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000323 PyErr_Format(PyExc_SystemError,
324 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 goto error;
326 }
327 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 ast_error_finish(filename);
329 return NULL;
330}
331
332/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
333*/
334
335static operator_ty
336get_operator(const node *n)
337{
338 switch (TYPE(n)) {
339 case VBAR:
340 return BitOr;
341 case CIRCUMFLEX:
342 return BitXor;
343 case AMPER:
344 return BitAnd;
345 case LEFTSHIFT:
346 return LShift;
347 case RIGHTSHIFT:
348 return RShift;
349 case PLUS:
350 return Add;
351 case MINUS:
352 return Sub;
353 case STAR:
354 return Mult;
355 case SLASH:
356 return Div;
357 case DOUBLESLASH:
358 return FloorDiv;
359 case PERCENT:
360 return Mod;
361 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000362 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363 }
364}
365
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366static const char* FORBIDDEN[] = {
367 "None",
368 "True",
369 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000370 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 NULL,
372};
373
374static int
375forbidden_name(expr_ty e, const node *n)
376{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000377 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000378 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000379 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000380 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000381 ast_error(n, "assignment to keyword");
382 return 1;
383 }
384 }
385 return 0;
386}
387
Jeremy Hyltona8293132006-02-28 17:58:27 +0000388/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389
390 Only sets context for expr kinds that "can appear in assignment context"
391 (according to ../Parser/Python.asdl). For other expr kinds, it sets
392 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393*/
394
395static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000396set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397{
398 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 /* If a particular expression type can't be used for assign / delete,
400 set expr_name to its name and an error message will be generated.
401 */
402 const char* expr_name = NULL;
403
404 /* The ast defines augmented store and load contexts, but the
405 implementation here doesn't actually use them. The code may be
406 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000409 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 */
411 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412
413 switch (e->kind) {
414 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Attribute.ctx = ctx;
416 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 e->v.Subscript.ctx = ctx;
419 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 case Starred_kind:
421 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000422 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000423 return 0;
424 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000426 if (ctx == Store) {
427 if (forbidden_name(e, n))
428 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 }
430 e->v.Name.ctx = ctx;
431 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 e->v.List.ctx = ctx;
434 s = e->v.List.elts;
435 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case Tuple_kind:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000437 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000439 e->v.Tuple.ctx = ctx;
440 s = e->v.Tuple.elts;
441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500472 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 expr_name = "literal";
474 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000475 case Ellipsis_kind:
476 expr_name = "Ellipsis";
477 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000478 case Compare_kind:
479 expr_name = "comparison";
480 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000481 case IfExp_kind:
482 expr_name = "conditional expression";
483 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000484 default:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000485 PyErr_Format(PyExc_SystemError,
486 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000487 e->kind, e->lineno);
488 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000490 /* Check for error string set by switch */
491 if (expr_name) {
492 char buf[300];
493 PyOS_snprintf(buf, sizeof(buf),
494 "can't %s %s",
495 ctx == Store ? "assign to" : "delete",
496 expr_name);
497 return ast_error(n, buf);
498 }
499
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000501 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 */
503 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000504 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505
Thomas Wouters89f507f2006-12-13 04:49:30 +0000506 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000507 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000508 return 0;
509 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510 }
511 return 1;
512}
513
514static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000515ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516{
517 REQ(n, augassign);
518 n = CHILD(n, 0);
519 switch (STR(n)[0]) {
520 case '+':
521 return Add;
522 case '-':
523 return Sub;
524 case '/':
525 if (STR(n)[1] == '/')
526 return FloorDiv;
527 else
528 return Div;
529 case '%':
530 return Mod;
531 case '<':
532 return LShift;
533 case '>':
534 return RShift;
535 case '&':
536 return BitAnd;
537 case '^':
538 return BitXor;
539 case '|':
540 return BitOr;
541 case '*':
542 if (STR(n)[1] == '*')
543 return Pow;
544 else
545 return Mult;
546 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000547 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549 }
550}
551
552static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000553ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000555 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 |'is' 'not'
557 */
558 REQ(n, comp_op);
559 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000560 n = CHILD(n, 0);
561 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 case LESS:
563 return Lt;
564 case GREATER:
565 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000566 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 return Eq;
568 case LESSEQUAL:
569 return LtE;
570 case GREATEREQUAL:
571 return GtE;
572 case NOTEQUAL:
573 return NotEq;
574 case NAME:
575 if (strcmp(STR(n), "in") == 0)
576 return In;
577 if (strcmp(STR(n), "is") == 0)
578 return Is;
579 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000580 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 }
585 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 /* handle "not in" and "is not" */
587 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588 case NAME:
589 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
590 return NotIn;
591 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
592 return IsNot;
593 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000594 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598 }
Neal Norwitz79792652005-11-14 04:25:03 +0000599 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000601 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602}
603
604static asdl_seq *
605seq_for_testlist(struct compiling *c, const node *n)
606{
607 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000608 asdl_seq *seq;
609 expr_ty expression;
610 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000611 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000613 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 if (!seq)
615 return NULL;
616
617 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000618 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619
620 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000621 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000623
624 assert(i / 2 < seq->size);
625 asdl_seq_SET(seq, i / 2, expression);
626 }
627 return seq;
628}
629
Neal Norwitzc1505362006-12-28 06:47:50 +0000630static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000631compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000632{
633 identifier name;
634 expr_ty annotation = NULL;
635 node *ch;
636
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000637 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000638 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000639 name = NEW_IDENTIFIER(ch);
640 if (!name)
641 return NULL;
642
643 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
644 annotation = ast_for_expr(c, CHILD(n, 2));
645 if (!annotation)
646 return NULL;
647 }
648
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000650#if 0
651 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
652 if (!set_context(c, result, Store, n))
653 return NULL;
654 return result;
655#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656}
657
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658/* returns -1 if failed to handle keyword only arguments
659 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000660 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 ^^^
662 start pointing here
663 */
664static int
665handle_keywordonly_args(struct compiling *c, const node *n, int start,
666 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
667{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000668 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000670 expr_ty expression, annotation;
671 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 int i = start;
673 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000674
675 if (kwonlyargs == NULL) {
676 ast_error(CHILD(n, start), "named arguments must follow bare *");
677 return -1;
678 }
679 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000680 while (i < NCH(n)) {
681 ch = CHILD(n, i);
682 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000683 case vfpdef:
684 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000686 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000687 if (!expression)
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000688 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 asdl_seq_SET(kwdefaults, j, expression);
690 i += 2; /* '=' and test */
691 }
692 else { /* setting NULL if no default value exists */
693 asdl_seq_SET(kwdefaults, j, NULL);
694 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000695 if (NCH(ch) == 3) {
696 /* ch is NAME ':' test */
697 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000698 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000699 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 }
701 else {
702 annotation = NULL;
703 }
704 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000705 argname = NEW_IDENTIFIER(ch);
706 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000707 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000708 arg = arg(argname, annotation, c->c_arena);
709 if (!arg)
710 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000711 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000712 i += 2; /* the name and the comma */
713 break;
714 case DOUBLESTAR:
715 return i;
716 default:
717 ast_error(ch, "unexpected node");
718 goto error;
719 }
720 }
721 return i;
722 error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000723 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000724}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725
Jeremy Hyltona8293132006-02-28 17:58:27 +0000726/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000727
728static arguments_ty
729ast_for_arguments(struct compiling *c, const node *n)
730{
Neal Norwitzc1505362006-12-28 06:47:50 +0000731 /* This function handles both typedargslist (function definition)
732 and varargslist (lambda definition).
733
734 parameters: '(' [typedargslist] ')'
735 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000736 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000737 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000738 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000739 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000740 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000741 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000742 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000743 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000744 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000746 int i, j, k, nposargs = 0, nkwonlyargs = 0;
747 int nposdefaults = 0, found_default = 0;
748 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000750 arg_ty arg;
751 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 node *ch;
753
754 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000755 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
757 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000758 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000760 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761
Jeremy Hyltone921e022008-07-17 16:37:17 +0000762 /* First count the number of positional args & defaults. The
763 variable i is the loop index for this for loop and the next.
764 The next loop picks up where the first leaves off.
765 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 ch = CHILD(n, i);
768 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000769 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000770 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000771 if (i < NCH(n) && /* skip argument following star */
772 (TYPE(CHILD(n, i)) == tfpdef ||
773 TYPE(CHILD(n, i)) == vfpdef)) {
774 i++;
775 }
776 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000778 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000779 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000780 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000782 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 defaults for keyword only args */
784 for ( ; i < NCH(n); ++i) {
785 ch = CHILD(n, i);
786 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000787 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000789 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
790 if (!posargs && nposargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000791 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 kwonlyargs = (nkwonlyargs ?
793 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
794 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000795 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000796 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
798 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000799 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000800 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 since we set NULL as default for keyword only argument w/o default
802 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000803 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
805 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000806 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807
808 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 ast_error(n, "more than 255 arguments");
810 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000811 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000813 /* tfpdef: NAME [':' test]
814 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815 */
816 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000817 j = 0; /* index for defaults */
818 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 ch = CHILD(n, i);
821 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000822 case tfpdef:
823 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
825 anything other than EQUAL or a comma? */
826 /* XXX Should NCH(n) check be made a separate check? */
827 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000828 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
829 if (!expression)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000830 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000831 assert(posdefaults != NULL);
832 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000836 else if (found_default) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000837 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000838 "non-default argument follows default argument");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000839 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000841 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000842 if (!arg)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000843 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000844 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845 i += 2; /* the name and the comma */
846 break;
847 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000848 if (i+1 >= NCH(n)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000849 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000850 "named arguments must follow bare *");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000851 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000852 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000853 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 if (TYPE(ch) == COMMA) {
855 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 i += 2; /* now follows keyword only arguments */
857 res = handle_keywordonly_args(c, n, i,
858 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000859 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 i = res; /* res has new position to process */
861 }
862 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000863 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000864 if (!vararg)
865 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000866 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000867 /* there is an annotation on the vararg */
868 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000869 if (!varargannotation)
870 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000871 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000872 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000873 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
874 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000875 int res = 0;
876 res = handle_keywordonly_args(c, n, i,
877 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000878 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000879 i = res; /* res has new position to process */
880 }
881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 break;
883 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000884 ch = CHILD(n, i+1); /* tfpdef */
885 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000886 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000887 if (!kwarg)
888 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 if (NCH(ch) > 1) {
890 /* there is an annotation on the kwarg */
891 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000892 if (!kwargannotation)
893 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 i += 3;
896 break;
897 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000898 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 "unexpected node in varargslist: %d @ %d",
900 TYPE(ch), i);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000901 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000902 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000904 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
905 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906}
907
908static expr_ty
909ast_for_dotted_name(struct compiling *c, const node *n)
910{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000911 expr_ty e;
912 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000913 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 int i;
915
916 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000917
918 lineno = LINENO(n);
919 col_offset = n->n_col_offset;
920
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 id = NEW_IDENTIFIER(CHILD(n, 0));
922 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000923 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000924 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000926 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927
928 for (i = 2; i < NCH(n); i+=2) {
929 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 if (!id)
931 return NULL;
932 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
933 if (!e)
934 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 }
936
937 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938}
939
940static expr_ty
941ast_for_decorator(struct compiling *c, const node *n)
942{
943 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
944 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000945 expr_ty name_expr;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000946
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000948 REQ(CHILD(n, 0), AT);
949 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000950
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
952 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000954
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000956 d = name_expr;
957 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 }
959 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000960 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000961 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000962 if (!d)
963 return NULL;
964 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 }
966 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000967 d = ast_for_call(c, CHILD(n, 3), name_expr);
968 if (!d)
969 return NULL;
970 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 }
972
973 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974}
975
976static asdl_seq*
977ast_for_decorators(struct compiling *c, const node *n)
978{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000979 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000980 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 int i;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000984 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 if (!decorator_seq)
986 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000989 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000990 if (!d)
991 return NULL;
992 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 }
994 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995}
996
997static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000998ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001000 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001001 identifier name;
1002 arguments_ty args;
1003 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001004 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001005 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006
1007 REQ(n, funcdef);
1008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009 name = NEW_IDENTIFIER(CHILD(n, name_i));
1010 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001011 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1013 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001014 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001015 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1016 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1017 if (!returns)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00001018 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001019 name_i += 2;
1020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 body = ast_for_suite(c, CHILD(n, name_i + 3));
1022 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024
Neal Norwitzc1505362006-12-28 06:47:50 +00001025 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001026 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027}
1028
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001029static stmt_ty
1030ast_for_decorated(struct compiling *c, const node *n)
1031{
1032 /* decorated: decorators (classdef | funcdef) */
1033 stmt_ty thing = NULL;
1034 asdl_seq *decorator_seq = NULL;
1035
1036 REQ(n, decorated);
1037
1038 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1039 if (!decorator_seq)
1040 return NULL;
1041
1042 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001043 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001044
1045 if (TYPE(CHILD(n, 1)) == funcdef) {
1046 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1047 } else if (TYPE(CHILD(n, 1)) == classdef) {
1048 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1049 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001050 /* we count the decorators in when talking about the class' or
1051 * function's line number */
1052 if (thing) {
1053 thing->lineno = LINENO(n);
1054 thing->col_offset = n->n_col_offset;
1055 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001056 return thing;
1057}
1058
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059static expr_ty
1060ast_for_lambdef(struct compiling *c, const node *n)
1061{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001062 /* lambdef: 'lambda' [varargslist] ':' test
1063 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 arguments_ty args;
1065 expr_ty expression;
1066
1067 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001068 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1069 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 if (!args)
1071 return NULL;
1072 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001073 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 }
1076 else {
1077 args = ast_for_arguments(c, CHILD(n, 1));
1078 if (!args)
1079 return NULL;
1080 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001081 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 }
1084
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001085 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086}
1087
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001088static expr_ty
1089ast_for_ifexpr(struct compiling *c, const node *n)
1090{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001091 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001092 expr_ty expression, body, orelse;
1093
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001094 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001095 body = ast_for_expr(c, CHILD(n, 0));
1096 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001097 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001098 expression = ast_for_expr(c, CHILD(n, 2));
1099 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001100 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001101 orelse = ast_for_expr(c, CHILD(n, 4));
1102 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001103 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1105 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001106}
1107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001109 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Nick Coghlan650f0d02007-04-15 12:05:43 +00001111 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112*/
1113
1114static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001115count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118
Guido van Rossumd8faa362007-04-27 19:54:29 +00001119 count_comp_for:
1120 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001121 REQ(n, comp_for);
1122 if (NCH(n) == 5)
1123 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001124 else
1125 return n_fors;
1126 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001127 REQ(n, comp_iter);
1128 n = CHILD(n, 0);
1129 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001130 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001131 else if (TYPE(n) == comp_if) {
1132 if (NCH(n) == 3) {
1133 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001134 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001135 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001136 else
1137 return n_fors;
1138 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001139
Guido van Rossumd8faa362007-04-27 19:54:29 +00001140 /* Should never be reached */
1141 PyErr_SetString(PyExc_SystemError,
1142 "logic error in count_comp_fors");
1143 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144}
1145
Nick Coghlan650f0d02007-04-15 12:05:43 +00001146/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Nick Coghlan650f0d02007-04-15 12:05:43 +00001148 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149*/
1150
1151static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001152count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001154 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 while (1) {
1157 REQ(n, comp_iter);
1158 if (TYPE(CHILD(n, 0)) == comp_for)
1159 return n_ifs;
1160 n = CHILD(n, 0);
1161 REQ(n, comp_if);
1162 n_ifs++;
1163 if (NCH(n) == 2)
1164 return n_ifs;
1165 n = CHILD(n, 2);
1166 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167}
1168
Guido van Rossum992d4a32007-07-11 13:09:30 +00001169static asdl_seq *
1170ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001173 asdl_seq *comps;
1174
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001175 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 if (n_fors == -1)
1177 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001178
Nick Coghlan650f0d02007-04-15 12:05:43 +00001179 comps = asdl_seq_new(n_fors, c->c_arena);
1180 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001184 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 asdl_seq *t;
1186 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001187 node *for_ch;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001188
Guido van Rossum992d4a32007-07-11 13:09:30 +00001189 REQ(n, comp_for);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001190
Guido van Rossum992d4a32007-07-11 13:09:30 +00001191 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001192 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001193 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001195 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001196 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001198
Thomas Wouters89f507f2006-12-13 04:49:30 +00001199 /* Check the # of children rather than the length of t, since
1200 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1201 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001202 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1203 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001206 c->c_arena),
1207 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001208
Nick Coghlan650f0d02007-04-15 12:05:43 +00001209 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001211
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 int j, n_ifs;
1214 asdl_seq *ifs;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001215
Guido van Rossum992d4a32007-07-11 13:09:30 +00001216 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001217 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001218 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220
1221 ifs = asdl_seq_new(n_ifs, c->c_arena);
1222 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001226 REQ(n, comp_iter);
1227 n = CHILD(n, 0);
1228 REQ(n, comp_if);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001229
Guido van Rossum992d4a32007-07-11 13:09:30 +00001230 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001231 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001232 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001233 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001234 if (NCH(n) == 3)
1235 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001237 /* on exit, must guarantee that n is a comp_for */
1238 if (TYPE(n) == comp_iter)
1239 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001240 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001242 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001244 return comps;
1245}
1246
1247static expr_ty
1248ast_for_itercomp(struct compiling *c, const node *n, int type)
1249{
1250 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1251 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1252 expr_ty elt;
1253 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001254
Guido van Rossum992d4a32007-07-11 13:09:30 +00001255 assert(NCH(n) > 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001256
Guido van Rossum992d4a32007-07-11 13:09:30 +00001257 elt = ast_for_expr(c, CHILD(n, 0));
1258 if (!elt)
1259 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001260
Guido van Rossum992d4a32007-07-11 13:09:30 +00001261 comps = ast_for_comprehension(c, CHILD(n, 1));
1262 if (!comps)
1263 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001264
1265 if (type == COMP_GENEXP)
1266 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1267 else if (type == COMP_LISTCOMP)
1268 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1269 else if (type == COMP_SETCOMP)
1270 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1271 else
1272 /* Should never happen */
1273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274}
1275
1276static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001277ast_for_dictcomp(struct compiling *c, const node *n)
1278{
1279 expr_ty key, value;
1280 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001281
Guido van Rossum992d4a32007-07-11 13:09:30 +00001282 assert(NCH(n) > 3);
1283 REQ(CHILD(n, 1), COLON);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001284
Guido van Rossum992d4a32007-07-11 13:09:30 +00001285 key = ast_for_expr(c, CHILD(n, 0));
1286 if (!key)
1287 return NULL;
1288
1289 value = ast_for_expr(c, CHILD(n, 2));
1290 if (!value)
1291 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001292
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293 comps = ast_for_comprehension(c, CHILD(n, 3));
1294 if (!comps)
1295 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001296
Guido van Rossum992d4a32007-07-11 13:09:30 +00001297 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1298}
1299
1300static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001301ast_for_genexp(struct compiling *c, const node *n)
1302{
1303 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001304 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001305}
1306
1307static expr_ty
1308ast_for_listcomp(struct compiling *c, const node *n)
1309{
1310 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001311 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001312}
1313
1314static expr_ty
1315ast_for_setcomp(struct compiling *c, const node *n)
1316{
1317 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001318 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001319}
1320
1321
1322static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323ast_for_atom(struct compiling *c, const node *n)
1324{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001325 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1326 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001327 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 */
1329 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001330 int bytesmode = 0;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001331
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001333 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001334 /* All names start in Load context, but may later be
1335 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001336 PyObject *name = NEW_IDENTIFIER(ch);
1337 if (!name)
1338 return NULL;
1339 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1340 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001341 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001342 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001343 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001344 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001345 PyObject *type, *value, *tback, *errstr;
1346 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001347 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001348 if (errstr) {
1349 char *s = "";
1350 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001351 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1353 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001354 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001355 } else {
1356 ast_error(n, "(unicode error) unknown error");
1357 }
1358 Py_DECREF(type);
1359 Py_DECREF(value);
1360 Py_XDECREF(tback);
1361 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001362 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001363 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001365 if (bytesmode)
1366 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1367 else
1368 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 }
1370 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001371 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 if (!pynum)
1373 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001374
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 PyArena_AddPyObject(c->c_arena, pynum);
1376 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 }
Georg Brandldde00282007-03-18 19:01:53 +00001378 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001379 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001382
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 if (TYPE(ch) == RPAR)
1384 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001385
Thomas Wouters89f507f2006-12-13 04:49:30 +00001386 if (TYPE(ch) == yield_expr)
1387 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001388
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001389 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001390 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 return ast_for_genexp(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001392
Nick Coghlan650f0d02007-04-15 12:05:43 +00001393 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001395 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001396
Thomas Wouters89f507f2006-12-13 04:49:30 +00001397 if (TYPE(ch) == RSQB)
1398 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001399
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001401 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1402 asdl_seq *elts = seq_for_testlist(c, ch);
1403 if (!elts)
1404 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001405
Thomas Wouters89f507f2006-12-13 04:49:30 +00001406 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1407 }
1408 else
1409 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001410 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001411 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1412 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001413 int i, size;
1414 asdl_seq *keys, *values;
1415
1416 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001417 if (TYPE(ch) == RBRACE) {
1418 /* it's an empty dict */
1419 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1420 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1421 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001422 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001423 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001424 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001425 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001426 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001427 for (i = 0; i < NCH(ch); i += 2) {
1428 expr_ty expression;
1429 expression = ast_for_expr(c, CHILD(ch, i));
1430 if (!expression)
1431 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001432 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001433 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001434 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1435 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1436 /* it's a set comprehension */
1437 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001438 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1439 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001440 } else {
1441 /* it's a dict */
1442 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1443 keys = asdl_seq_new(size, c->c_arena);
1444 if (!keys)
1445 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001446
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 values = asdl_seq_new(size, c->c_arena);
1448 if (!values)
1449 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001450
Guido van Rossum86e58e22006-08-28 15:27:34 +00001451 for (i = 0; i < NCH(ch); i += 4) {
1452 expr_ty expression;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001453
Guido van Rossum86e58e22006-08-28 15:27:34 +00001454 expression = ast_for_expr(c, CHILD(ch, i));
1455 if (!expression)
1456 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001457
Guido van Rossum86e58e22006-08-28 15:27:34 +00001458 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001459
Guido van Rossum86e58e22006-08-28 15:27:34 +00001460 expression = ast_for_expr(c, CHILD(ch, i + 2));
1461 if (!expression)
1462 return NULL;
1463
1464 asdl_seq_SET(values, i / 4, expression);
1465 }
1466 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1467 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001470 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1471 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 }
1473}
1474
1475static slice_ty
1476ast_for_slice(struct compiling *c, const node *n)
1477{
1478 node *ch;
1479 expr_ty lower = NULL, upper = NULL, step = NULL;
1480
1481 REQ(n, subscript);
1482
1483 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001484 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 sliceop: ':' [test]
1486 */
1487 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (NCH(n) == 1 && TYPE(ch) == test) {
1489 /* 'step' variable hold no significance in terms of being used over
1490 other vars */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001491 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 if (!step)
1493 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001494
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 }
1497
1498 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001499 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 if (!lower)
1501 return NULL;
1502 }
1503
1504 /* If there's an upper bound it's in the second or third position. */
1505 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001506 if (NCH(n) > 1) {
1507 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508
Thomas Wouters89f507f2006-12-13 04:49:30 +00001509 if (TYPE(n2) == test) {
1510 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001511 if (!upper)
1512 return NULL;
1513 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001514 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001516 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Thomas Wouters89f507f2006-12-13 04:49:30 +00001518 if (TYPE(n2) == test) {
1519 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (!upper)
1521 return NULL;
1522 }
1523 }
1524
1525 ch = CHILD(n, NCH(n) - 1);
1526 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001527 if (NCH(ch) == 1) {
1528 /* No expression, so step is None */
1529 ch = CHILD(ch, 0);
1530 step = Name(new_identifier("None", c->c_arena), Load,
1531 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532 if (!step)
1533 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001534 } else {
1535 ch = CHILD(ch, 1);
1536 if (TYPE(ch) == test) {
1537 step = ast_for_expr(c, ch);
1538 if (!step)
1539 return NULL;
1540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 }
1542 }
1543
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001544 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545}
1546
1547static expr_ty
1548ast_for_binop(struct compiling *c, const node *n)
1549{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550 /* Must account for a sequence of expressions.
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001551 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 BinOp(BinOp(A, op, B), op, C).
1553 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554
Guido van Rossumd8faa362007-04-27 19:54:29 +00001555 int i, nops;
1556 expr_ty expr1, expr2, result;
1557 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558
Guido van Rossumd8faa362007-04-27 19:54:29 +00001559 expr1 = ast_for_expr(c, CHILD(n, 0));
1560 if (!expr1)
1561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562
Guido van Rossumd8faa362007-04-27 19:54:29 +00001563 expr2 = ast_for_expr(c, CHILD(n, 2));
1564 if (!expr2)
1565 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 newoperator = get_operator(CHILD(n, 1));
1568 if (!newoperator)
1569 return NULL;
1570
1571 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1572 c->c_arena);
1573 if (!result)
1574 return NULL;
1575
1576 nops = (NCH(n) - 1) / 2;
1577 for (i = 1; i < nops; i++) {
1578 expr_ty tmp_result, tmp;
1579 const node* next_oper = CHILD(n, i * 2 + 1);
1580
1581 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001582 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 return NULL;
1584
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1586 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587 return NULL;
1588
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001589 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001590 LINENO(next_oper), next_oper->n_col_offset,
1591 c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001592 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 return NULL;
1594 result = tmp_result;
1595 }
1596 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597}
1598
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001599static expr_ty
1600ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1601{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001602 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001603 subscriptlist: subscript (',' subscript)* [',']
1604 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1605 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001606 REQ(n, trailer);
1607 if (TYPE(CHILD(n, 0)) == LPAR) {
1608 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001609 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1610 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001612 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001613 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001614 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001615 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1616 if (!attr_id)
1617 return NULL;
1618 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001619 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001620 }
1621 else {
1622 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 REQ(CHILD(n, 2), RSQB);
1624 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001625 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1627 if (!slc)
1628 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001629 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1630 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 }
1632 else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001633 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001634 by treating the sequence as a tuple literal if there are
1635 no slice features.
1636 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 int j;
1638 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001639 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001640 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001641 asdl_seq *slices, *elts;
1642 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 if (!slices)
1644 return NULL;
1645 for (j = 0; j < NCH(n); j += 2) {
1646 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001647 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001648 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001649 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001650 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 asdl_seq_SET(slices, j / 2, slc);
1652 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001653 if (!simple) {
1654 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 }
1657 /* extract Index values and put them in a Tuple */
1658 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001659 if (!elts)
1660 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001661 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1662 slc = (slice_ty)asdl_seq_GET(slices, j);
1663 assert(slc->kind == Index_kind && slc->v.Index.value);
1664 asdl_seq_SET(elts, j, slc->v.Index.value);
1665 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001666 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001667 if (!e)
1668 return NULL;
1669 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001670 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 }
1672 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001673}
1674
1675static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001676ast_for_factor(struct compiling *c, const node *n)
1677{
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001678 node *pfactor, *ppower, *patom, *pnum;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001679 expr_ty expression;
1680
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001681 /* If the unary - operator is applied to a constant, don't generate
1682 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1683 constant. The peephole optimizer already does something like
1684 this but it doesn't handle the case where the constant is
1685 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1686 PyLongObject.
1687 */
1688 if (TYPE(CHILD(n, 0)) == MINUS
1689 && NCH(n) == 2
1690 && TYPE((pfactor = CHILD(n, 1))) == factor
1691 && NCH(pfactor) == 1
1692 && TYPE((ppower = CHILD(pfactor, 0))) == power
1693 && NCH(ppower) == 1
1694 && TYPE((patom = CHILD(ppower, 0))) == atom
1695 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1696 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1697 if (s == NULL)
1698 return NULL;
1699 s[0] = '-';
1700 strcpy(s + 1, STR(pnum));
1701 PyObject_FREE(STR(pnum));
1702 STR(pnum) = s;
1703 return ast_for_atom(c, patom);
1704 }
1705
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001706 expression = ast_for_expr(c, CHILD(n, 1));
1707 if (!expression)
1708 return NULL;
1709
1710 switch (TYPE(CHILD(n, 0))) {
1711 case PLUS:
1712 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1713 c->c_arena);
1714 case MINUS:
1715 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1716 c->c_arena);
1717 case TILDE:
1718 return UnaryOp(Invert, expression, LINENO(n),
1719 n->n_col_offset, c->c_arena);
1720 }
1721 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1722 TYPE(CHILD(n, 0)));
1723 return NULL;
1724}
1725
1726static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001727ast_for_power(struct compiling *c, const node *n)
1728{
1729 /* power: atom trailer* ('**' factor)*
1730 */
1731 int i;
1732 expr_ty e, tmp;
1733 REQ(n, power);
1734 e = ast_for_atom(c, CHILD(n, 0));
1735 if (!e)
1736 return NULL;
1737 if (NCH(n) == 1)
1738 return e;
1739 for (i = 1; i < NCH(n); i++) {
1740 node *ch = CHILD(n, i);
1741 if (TYPE(ch) != trailer)
1742 break;
1743 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001745 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001746 tmp->lineno = e->lineno;
1747 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001748 e = tmp;
1749 }
1750 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1751 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001752 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001753 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001754 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001755 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001756 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001757 e = tmp;
1758 }
1759 return e;
1760}
1761
Guido van Rossum0368b722007-05-11 16:50:42 +00001762static expr_ty
1763ast_for_starred(struct compiling *c, const node *n)
1764{
1765 expr_ty tmp;
1766 REQ(n, star_expr);
1767
1768 tmp = ast_for_expr(c, CHILD(n, 1));
1769 if (!tmp)
1770 return NULL;
1771
1772 /* The Load context is changed later. */
1773 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1774}
1775
1776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777/* Do not name a variable 'expr'! Will cause a compile error.
1778*/
1779
1780static expr_ty
1781ast_for_expr(struct compiling *c, const node *n)
1782{
1783 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001784 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001785 test_nocond: or_test | lambdef_nocond
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001786 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 and_test: not_test ('and' not_test)*
1788 not_test: 'not' not_test | comparison
1789 comparison: expr (comp_op expr)*
1790 expr: xor_expr ('|' xor_expr)*
1791 xor_expr: and_expr ('^' and_expr)*
1792 and_expr: shift_expr ('&' shift_expr)*
1793 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1794 arith_expr: term (('+'|'-') term)*
1795 term: factor (('*'|'/'|'%'|'//') factor)*
1796 factor: ('+'|'-'|'~') factor | power
1797 power: atom trailer* ('**' factor)*
1798 */
1799
1800 asdl_seq *seq;
1801 int i;
1802
1803 loop:
1804 switch (TYPE(n)) {
1805 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001806 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001807 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001810 else if (NCH(n) > 1)
1811 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001812 /* Fallthrough */
1813 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 case and_test:
1815 if (NCH(n) == 1) {
1816 n = CHILD(n, 0);
1817 goto loop;
1818 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001819 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 if (!seq)
1821 return NULL;
1822 for (i = 0; i < NCH(n); i += 2) {
1823 expr_ty e = ast_for_expr(c, CHILD(n, i));
1824 if (!e)
1825 return NULL;
1826 asdl_seq_SET(seq, i / 2, e);
1827 }
1828 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1830 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001831 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001832 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 case not_test:
1834 if (NCH(n) == 1) {
1835 n = CHILD(n, 0);
1836 goto loop;
1837 }
1838 else {
1839 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1840 if (!expression)
1841 return NULL;
1842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1844 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 }
1846 case comparison:
1847 if (NCH(n) == 1) {
1848 n = CHILD(n, 0);
1849 goto loop;
1850 }
1851 else {
1852 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001853 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 if (!ops)
1857 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001858 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 return NULL;
1861 }
1862 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001863 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001865 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869
1870 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001871 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001873 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001874
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001875 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 asdl_seq_SET(cmps, i / 2, expression);
1877 }
1878 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001879 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001882
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001883 return Compare(expression, ops, cmps, LINENO(n),
1884 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 }
1886 break;
1887
Guido van Rossum0368b722007-05-11 16:50:42 +00001888 case star_expr:
1889 if (TYPE(CHILD(n, 0)) == STAR) {
1890 return ast_for_starred(c, n);
1891 }
1892 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 /* The next five cases all handle BinOps. The main body of code
1894 is the same in each case, but the switch turned inside out to
1895 reuse the code for each type of operator.
1896 */
1897 case expr:
1898 case xor_expr:
1899 case and_expr:
1900 case shift_expr:
1901 case arith_expr:
1902 case term:
1903 if (NCH(n) == 1) {
1904 n = CHILD(n, 0);
1905 goto loop;
1906 }
1907 return ast_for_binop(c, n);
1908 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 expr_ty exp = NULL;
1910 if (NCH(n) == 2) {
1911 exp = ast_for_testlist(c, CHILD(n, 1));
1912 if (!exp)
1913 return NULL;
1914 }
1915 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1916 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001917 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 if (NCH(n) == 1) {
1919 n = CHILD(n, 0);
1920 goto loop;
1921 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001922 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001923 case power:
1924 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001926 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 return NULL;
1928 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001929 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 return NULL;
1931}
1932
1933static expr_ty
1934ast_for_call(struct compiling *c, const node *n, expr_ty func)
1935{
1936 /*
1937 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1938 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001939 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 */
1941
1942 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001943 asdl_seq *args;
1944 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 expr_ty vararg = NULL, kwarg = NULL;
1946
1947 REQ(n, arglist);
1948
1949 nargs = 0;
1950 nkeywords = 0;
1951 ngens = 0;
1952 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001953 node *ch = CHILD(n, i);
1954 if (TYPE(ch) == argument) {
1955 if (NCH(ch) == 1)
1956 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 nkeywords++;
1961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 }
1963 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001964 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 "if not sole argument");
1966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
1968
1969 if (nargs + nkeywords + ngens > 255) {
1970 ast_error(n, "more than 255 arguments");
1971 return NULL;
1972 }
1973
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001974 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001976 return NULL;
1977 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 nargs = 0;
1981 nkeywords = 0;
1982 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 node *ch = CHILD(n, i);
1984 if (TYPE(ch) == argument) {
1985 expr_ty e;
1986 if (NCH(ch) == 1) {
1987 if (nkeywords) {
1988 ast_error(CHILD(ch, 0),
1989 "non-keyword arg after keyword arg");
1990 return NULL;
1991 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001992 if (vararg) {
1993 ast_error(CHILD(ch, 0),
1994 "only named arguments may follow *expression");
1995 return NULL;
1996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001999 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 asdl_seq_SET(args, nargs++, e);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002001 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002002 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 else {
2009 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002010 identifier key, tmp;
2011 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002013 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002014 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 /* f(lambda x: x[0] = 3) ends up getting parsed with
2018 * LHS test = lambda x: x[0], and RHS test = 3.
2019 * SF bug 132313 points out that complaining about a keyword
2020 * then is very confusing.
2021 */
2022 if (e->kind == Lambda_kind) {
2023 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002024 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 } else if (e->kind != Name_kind) {
2026 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002027 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002028 } else if (forbidden_name(e, ch)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002029 return NULL;
2030 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002032 for (k = 0; k < nkeywords; k++) {
2033 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2034 if (!PyUnicode_Compare(tmp, key)) {
2035 ast_error(CHILD(ch, 0), "keyword argument repeated");
2036 return NULL;
2037 }
2038 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 asdl_seq_SET(keywords, nkeywords++, kw);
2046 }
2047 }
2048 else if (TYPE(ch) == STAR) {
2049 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002050 if (!vararg)
2051 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 i++;
2053 }
2054 else if (TYPE(ch) == DOUBLESTAR) {
2055 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002056 if (!kwarg)
2057 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002058 i++;
2059 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
2061
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002062 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063}
2064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002068 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002069 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002070 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002072 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002073 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002074 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002075 }
2076 else {
2077 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002078 TYPE(n) == testlist1);
2079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 else {
2083 asdl_seq *tmp = seq_for_testlist(c, n);
2084 if (!tmp)
2085 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002088}
2089
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090static stmt_ty
2091ast_for_expr_stmt(struct compiling *c, const node *n)
2092{
2093 REQ(n, expr_stmt);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002094 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 | ('=' (yield_expr|testlist))*)
2096 testlist: test (',' test)* [',']
2097 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002098 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 test: ... here starts the operator precendence dance
2100 */
2101
2102 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (!e)
2105 return NULL;
2106
Thomas Wouters89f507f2006-12-13 04:49:30 +00002107 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 }
2109 else if (TYPE(CHILD(n, 1)) == augassign) {
2110 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002111 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113
Thomas Wouters89f507f2006-12-13 04:49:30 +00002114 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 if (!expr1)
2116 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002117 if(!set_context(c, expr1, Store, ch))
2118 return NULL;
Benjamin Peterson4fac7062009-10-03 20:28:47 +00002119 /* set_context checks that most expressions are not the left side.
2120 Augmented assignments can only have a name, a subscript, or an
2121 attribute on the left, though, so we have to explicitly check for
2122 those. */
2123 switch (expr1->kind) {
2124 case Name_kind:
2125 case Attribute_kind:
2126 case Subscript_kind:
2127 break;
2128 default:
2129 ast_error(ch, "illegal expression for augmented assignment");
2130 return NULL;
2131 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132
Thomas Wouters89f507f2006-12-13 04:49:30 +00002133 ch = CHILD(n, 2);
2134 if (TYPE(ch) == testlist)
2135 expr2 = ast_for_testlist(c, ch);
2136 else
2137 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002138 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 return NULL;
2140
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002141 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002142 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 return NULL;
2144
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146 }
2147 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002148 int i;
2149 asdl_seq *targets;
2150 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151 expr_ty expression;
2152
Thomas Wouters89f507f2006-12-13 04:49:30 +00002153 /* a normal assignment */
2154 REQ(CHILD(n, 1), EQUAL);
2155 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2156 if (!targets)
2157 return NULL;
2158 for (i = 0; i < NCH(n) - 2; i += 2) {
2159 expr_ty e;
2160 node *ch = CHILD(n, i);
2161 if (TYPE(ch) == yield_expr) {
2162 ast_error(ch, "assignment to yield expression not possible");
2163 return NULL;
2164 }
2165 e = ast_for_testlist(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002166 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002167 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002169 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002170 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172
Thomas Wouters89f507f2006-12-13 04:49:30 +00002173 asdl_seq_SET(targets, i / 2, e);
2174 }
2175 value = CHILD(n, NCH(n) - 1);
2176 if (TYPE(value) == testlist)
2177 expression = ast_for_testlist(c, value);
2178 else
2179 expression = ast_for_expr(c, value);
2180 if (!expression)
2181 return NULL;
2182 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184}
2185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002187ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188{
2189 asdl_seq *seq;
2190 int i;
2191 expr_ty e;
2192
2193 REQ(n, exprlist);
2194
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002195 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002197 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002199 e = ast_for_expr(c, CHILD(n, i));
2200 if (!e)
2201 return NULL;
2202 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002203 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002204 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205 }
2206 return seq;
2207}
2208
2209static stmt_ty
2210ast_for_del_stmt(struct compiling *c, const node *n)
2211{
2212 asdl_seq *expr_list;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 /* del_stmt: 'del' exprlist */
2215 REQ(n, del_stmt);
2216
2217 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2218 if (!expr_list)
2219 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002220 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221}
2222
2223static stmt_ty
2224ast_for_flow_stmt(struct compiling *c, const node *n)
2225{
2226 /*
2227 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2228 | yield_stmt
2229 break_stmt: 'break'
2230 continue_stmt: 'continue'
2231 return_stmt: 'return' [testlist]
2232 yield_stmt: yield_expr
2233 yield_expr: 'yield' testlist
2234 raise_stmt: 'raise' [test [',' test [',' test]]]
2235 */
2236 node *ch;
2237
2238 REQ(n, flow_stmt);
2239 ch = CHILD(n, 0);
2240 switch (TYPE(ch)) {
2241 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002244 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002246 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2247 if (!exp)
2248 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002249 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 }
2251 case return_stmt:
2252 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002253 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002255 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 if (!expression)
2257 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002258 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 }
2260 case raise_stmt:
2261 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002262 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2263 else if (NCH(ch) >= 2) {
2264 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2266 if (!expression)
2267 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002268 if (NCH(ch) == 4) {
2269 cause = ast_for_expr(c, CHILD(ch, 3));
2270 if (!cause)
2271 return NULL;
2272 }
2273 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 }
2275 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002276 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 "unexpected flow_stmt: %d", TYPE(ch));
2278 return NULL;
2279 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002280
2281 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2282 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283}
2284
2285static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002286alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287{
2288 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002289 import_as_name: NAME ['as' NAME]
2290 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 dotted_name: NAME ('.' NAME)*
2292 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002293 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002294
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295 loop:
2296 switch (TYPE(n)) {
2297 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002298 str = NULL;
2299 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002300 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002301 if (!str)
2302 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002303 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002304 name = NEW_IDENTIFIER(CHILD(n, 0));
2305 if (!name)
2306 return NULL;
2307 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 case dotted_as_name:
2309 if (NCH(n) == 1) {
2310 n = CHILD(n, 0);
2311 goto loop;
2312 }
2313 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002314 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002315 if (!a)
2316 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 assert(!a->asname);
2318 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002319 if (!a->asname)
2320 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 return a;
2322 }
2323 break;
2324 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002325 if (NCH(n) == 1) {
2326 name = NEW_IDENTIFIER(CHILD(n, 0));
2327 if (!name)
2328 return NULL;
2329 return alias(name, NULL, c->c_arena);
2330 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 else {
2332 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002333 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002334 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 char *s;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002336 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337
2338 len = 0;
2339 for (i = 0; i < NCH(n); i += 2)
2340 /* length of string plus one for the dot */
2341 len += strlen(STR(CHILD(n, i))) + 1;
2342 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002343 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 if (!str)
2345 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002346 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 if (!s)
2348 return NULL;
2349 for (i = 0; i < NCH(n); i += 2) {
2350 char *sch = STR(CHILD(n, i));
2351 strcpy(s, STR(CHILD(n, i)));
2352 s += strlen(sch);
2353 *s++ = '.';
2354 }
2355 --s;
2356 *s = '\0';
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002357 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2358 PyBytes_GET_SIZE(str),
2359 NULL);
2360 Py_DECREF(str);
2361 if (!uni)
2362 return NULL;
2363 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002364 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002365 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002366 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 }
2368 break;
2369 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002370 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002371 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002372 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002374 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 "unexpected import name: %d", TYPE(n));
2376 return NULL;
2377 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002378
2379 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 return NULL;
2381}
2382
2383static stmt_ty
2384ast_for_import_stmt(struct compiling *c, const node *n)
2385{
2386 /*
2387 import_stmt: import_name | import_from
2388 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002389 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2390 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002392 int lineno;
2393 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 int i;
2395 asdl_seq *aliases;
2396
2397 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002398 lineno = LINENO(n);
2399 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002401 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002403 REQ(n, dotted_as_names);
2404 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2405 if (!aliases)
2406 return NULL;
2407 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002408 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002409 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002413 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002415 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 int idx, ndots = 0;
2418 alias_ty mod = NULL;
2419 identifier modname;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002420
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002421 /* Count the number of dots (for relative imports) and check for the
2422 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 for (idx = 1; idx < NCH(n); idx++) {
2424 if (TYPE(CHILD(n, idx)) == dotted_name) {
2425 mod = alias_for_import_name(c, CHILD(n, idx));
2426 idx++;
2427 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002428 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002429 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002430 ndots += 3;
2431 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 } else if (TYPE(CHILD(n, idx)) != DOT) {
2433 break;
2434 }
2435 ndots++;
2436 }
2437 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002438 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002439 case STAR:
2440 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 n = CHILD(n, idx);
2442 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002443 break;
2444 case LPAR:
2445 /* from ... import (x, y, z) */
2446 n = CHILD(n, idx + 1);
2447 n_children = NCH(n);
2448 break;
2449 case import_as_names:
2450 /* from ... import x, y, z */
2451 n = CHILD(n, idx);
2452 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002453 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454 ast_error(n, "trailing comma not allowed without"
2455 " surrounding parentheses");
2456 return NULL;
2457 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002458 break;
2459 default:
2460 ast_error(n, "Unexpected node-type in from-import");
2461 return NULL;
2462 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2465 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467
2468 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002469 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002470 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002471 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002475 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002476 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002477 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2478 if (!import_alias)
2479 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002481 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002483 if (mod != NULL)
2484 modname = mod->name;
2485 else
2486 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002487 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002488 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 }
Neal Norwitz79792652005-11-14 04:25:03 +00002490 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002491 "unknown import statement: starts with command '%s'",
2492 STR(CHILD(n, 0)));
2493 return NULL;
2494}
2495
2496static stmt_ty
2497ast_for_global_stmt(struct compiling *c, const node *n)
2498{
2499 /* global_stmt: 'global' NAME (',' NAME)* */
2500 identifier name;
2501 asdl_seq *s;
2502 int i;
2503
2504 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002505 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 name = NEW_IDENTIFIER(CHILD(n, i));
2510 if (!name)
2511 return NULL;
2512 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002514 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002515}
2516
2517static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002518ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2519{
2520 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2521 identifier name;
2522 asdl_seq *s;
2523 int i;
2524
2525 REQ(n, nonlocal_stmt);
2526 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2527 if (!s)
2528 return NULL;
2529 for (i = 1; i < NCH(n); i += 2) {
2530 name = NEW_IDENTIFIER(CHILD(n, i));
2531 if (!name)
2532 return NULL;
2533 asdl_seq_SET(s, i / 2, name);
2534 }
2535 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2536}
2537
2538static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539ast_for_assert_stmt(struct compiling *c, const node *n)
2540{
2541 /* assert_stmt: 'assert' test [',' test] */
2542 REQ(n, assert_stmt);
2543 if (NCH(n) == 2) {
2544 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2545 if (!expression)
2546 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002547 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
2549 else if (NCH(n) == 4) {
2550 expr_ty expr1, expr2;
2551
2552 expr1 = ast_for_expr(c, CHILD(n, 1));
2553 if (!expr1)
2554 return NULL;
2555 expr2 = ast_for_expr(c, CHILD(n, 3));
2556 if (!expr2)
2557 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002558
Thomas Wouters89f507f2006-12-13 04:49:30 +00002559 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 }
Neal Norwitz79792652005-11-14 04:25:03 +00002561 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 "improper number of parts to 'assert' statement: %d",
2563 NCH(n));
2564 return NULL;
2565}
2566
2567static asdl_seq *
2568ast_for_suite(struct compiling *c, const node *n)
2569{
2570 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002571 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 stmt_ty s;
2573 int i, total, num, end, pos = 0;
2574 node *ch;
2575
2576 REQ(n, suite);
2577
2578 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002579 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002583 n = CHILD(n, 0);
2584 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002585 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002586 */
2587 end = NCH(n) - 1;
2588 if (TYPE(CHILD(n, end - 1)) == SEMI)
2589 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002591 for (i = 0; i < end; i += 2) {
2592 ch = CHILD(n, i);
2593 s = ast_for_stmt(c, ch);
2594 if (!s)
2595 return NULL;
2596 asdl_seq_SET(seq, pos++, s);
2597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 }
2599 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002600 for (i = 2; i < (NCH(n) - 1); i++) {
2601 ch = CHILD(n, i);
2602 REQ(ch, stmt);
2603 num = num_stmts(ch);
2604 if (num == 1) {
2605 /* small_stmt or compound_stmt with only one child */
2606 s = ast_for_stmt(c, ch);
2607 if (!s)
2608 return NULL;
2609 asdl_seq_SET(seq, pos++, s);
2610 }
2611 else {
2612 int j;
2613 ch = CHILD(ch, 0);
2614 REQ(ch, simple_stmt);
2615 for (j = 0; j < NCH(ch); j += 2) {
2616 /* statement terminates with a semi-colon ';' */
2617 if (NCH(CHILD(ch, j)) == 0) {
2618 assert((j + 1) == NCH(ch));
2619 break;
2620 }
2621 s = ast_for_stmt(c, CHILD(ch, j));
2622 if (!s)
2623 return NULL;
2624 asdl_seq_SET(seq, pos++, s);
2625 }
2626 }
2627 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 }
2629 assert(pos == seq->size);
2630 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631}
2632
2633static stmt_ty
2634ast_for_if_stmt(struct compiling *c, const node *n)
2635{
2636 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2637 ['else' ':' suite]
2638 */
2639 char *s;
2640
2641 REQ(n, if_stmt);
2642
2643 if (NCH(n) == 4) {
2644 expr_ty expression;
2645 asdl_seq *suite_seq;
2646
2647 expression = ast_for_expr(c, CHILD(n, 1));
2648 if (!expression)
2649 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002650 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002651 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002653
Guido van Rossumd8faa362007-04-27 19:54:29 +00002654 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2655 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002657
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 s = STR(CHILD(n, 4));
2659 /* s[2], the third character in the string, will be
2660 's' for el_s_e, or
2661 'i' for el_i_f
2662 */
2663 if (s[2] == 's') {
2664 expr_ty expression;
2665 asdl_seq *seq1, *seq2;
2666
2667 expression = ast_for_expr(c, CHILD(n, 1));
2668 if (!expression)
2669 return NULL;
2670 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002671 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 return NULL;
2673 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002674 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 return NULL;
2676
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2678 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 }
2680 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002682 expr_ty expression;
2683 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 asdl_seq *orelse = NULL;
2685 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 /* must reference the child n_elif+1 since 'else' token is third,
2687 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2689 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2690 has_else = 1;
2691 n_elif -= 3;
2692 }
2693 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694
Thomas Wouters89f507f2006-12-13 04:49:30 +00002695 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002696 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697
Thomas Wouters89f507f2006-12-13 04:49:30 +00002698 orelse = asdl_seq_new(1, c->c_arena);
2699 if (!orelse)
2700 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002702 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002704 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2705 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002707 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2708 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002711 asdl_seq_SET(orelse, 0,
2712 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002713 LINENO(CHILD(n, NCH(n) - 6)),
2714 CHILD(n, NCH(n) - 6)->n_col_offset,
2715 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002716 /* the just-created orelse handled the last elif */
2717 n_elif--;
2718 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 for (i = 0; i < n_elif; i++) {
2721 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2723 if (!newobj)
2724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731
Thomas Wouters89f507f2006-12-13 04:49:30 +00002732 asdl_seq_SET(newobj, 0,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002733 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002734 LINENO(CHILD(n, off)),
2735 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 orelse = newobj;
2737 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002738 expression = ast_for_expr(c, CHILD(n, 1));
2739 if (!expression)
2740 return NULL;
2741 suite_seq = ast_for_suite(c, CHILD(n, 3));
2742 if (!suite_seq)
2743 return NULL;
2744 return If(expression, suite_seq, orelse,
2745 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747
2748 PyErr_Format(PyExc_SystemError,
2749 "unexpected token in 'if' statement: %s", s);
2750 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751}
2752
2753static stmt_ty
2754ast_for_while_stmt(struct compiling *c, const node *n)
2755{
2756 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2757 REQ(n, while_stmt);
2758
2759 if (NCH(n) == 4) {
2760 expr_ty expression;
2761 asdl_seq *suite_seq;
2762
2763 expression = ast_for_expr(c, CHILD(n, 1));
2764 if (!expression)
2765 return NULL;
2766 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002767 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002769 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 }
2771 else if (NCH(n) == 7) {
2772 expr_ty expression;
2773 asdl_seq *seq1, *seq2;
2774
2775 expression = ast_for_expr(c, CHILD(n, 1));
2776 if (!expression)
2777 return NULL;
2778 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
2781 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002782 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 return NULL;
2784
Thomas Wouters89f507f2006-12-13 04:49:30 +00002785 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002787
2788 PyErr_Format(PyExc_SystemError,
2789 "wrong number of tokens for 'while' statement: %d",
2790 NCH(n));
2791 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792}
2793
2794static stmt_ty
2795ast_for_for_stmt(struct compiling *c, const node *n)
2796{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002797 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 expr_ty expression;
2799 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002800 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002801 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2802 REQ(n, for_stmt);
2803
2804 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002805 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 if (!seq)
2807 return NULL;
2808 }
2809
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002810 node_target = CHILD(n, 1);
2811 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002814 /* Check the # of children rather than the length of _target, since
2815 for x, in ... has 1 element in _target, but still requires a Tuple. */
2816 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002817 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002819 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002821 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002822 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 return NULL;
2824 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002825 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 return NULL;
2827
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002828 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2829 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830}
2831
2832static excepthandler_ty
2833ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2834{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002835 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 REQ(exc, except_clause);
2837 REQ(body, suite);
2838
2839 if (NCH(exc) == 1) {
2840 asdl_seq *suite_seq = ast_for_suite(c, body);
2841 if (!suite_seq)
2842 return NULL;
2843
Neal Norwitzad74aa82008-03-31 05:14:30 +00002844 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002845 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 }
2847 else if (NCH(exc) == 2) {
2848 expr_ty expression;
2849 asdl_seq *suite_seq;
2850
2851 expression = ast_for_expr(c, CHILD(exc, 1));
2852 if (!expression)
2853 return NULL;
2854 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002855 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 return NULL;
2857
Neal Norwitzad74aa82008-03-31 05:14:30 +00002858 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002859 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002860 }
2861 else if (NCH(exc) == 4) {
2862 asdl_seq *suite_seq;
2863 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002864 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002865 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002868 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 return NULL;
2870 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002871 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 return NULL;
2873
Neal Norwitzad74aa82008-03-31 05:14:30 +00002874 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002875 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002877
2878 PyErr_Format(PyExc_SystemError,
2879 "wrong number of children for 'except' clause: %d",
2880 NCH(exc));
2881 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882}
2883
2884static stmt_ty
2885ast_for_try_stmt(struct compiling *c, const node *n)
2886{
Neal Norwitzf599f422005-12-17 21:33:47 +00002887 const int nch = NCH(n);
2888 int n_except = (nch - 3)/3;
2889 asdl_seq *body, *orelse = NULL, *finally = NULL;
2890
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891 REQ(n, try_stmt);
2892
Neal Norwitzf599f422005-12-17 21:33:47 +00002893 body = ast_for_suite(c, CHILD(n, 2));
2894 if (body == NULL)
2895 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896
Neal Norwitzf599f422005-12-17 21:33:47 +00002897 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2898 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2899 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2900 /* we can assume it's an "else",
2901 because nch >= 9 for try-else-finally and
2902 it would otherwise have a type of except_clause */
2903 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2904 if (orelse == NULL)
2905 return NULL;
2906 n_except--;
2907 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908
Neal Norwitzf599f422005-12-17 21:33:47 +00002909 finally = ast_for_suite(c, CHILD(n, nch - 1));
2910 if (finally == NULL)
2911 return NULL;
2912 n_except--;
2913 }
2914 else {
2915 /* we can assume it's an "else",
2916 otherwise it would have a type of except_clause */
2917 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2918 if (orelse == NULL)
2919 return NULL;
2920 n_except--;
2921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002923 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002924 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 return NULL;
2926 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002927
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002929 int i;
2930 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002931 /* process except statements to create a try ... except */
2932 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2933 if (handlers == NULL)
2934 return NULL;
2935
2936 for (i = 0; i < n_except; i++) {
2937 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2938 CHILD(n, 5 + i * 3));
2939 if (!e)
2940 return NULL;
2941 asdl_seq_SET(handlers, i, e);
2942 }
2943
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002945 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002946 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002948
2949 /* if a 'finally' is present too, we nest the TryExcept within a
2950 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002951 body = asdl_seq_new(1, c->c_arena);
2952 if (body == NULL)
2953 return NULL;
2954 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002955 }
2956
2957 /* must be a try ... finally (except clauses are in body, if any exist) */
2958 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002959 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960}
2961
Georg Brandl0c315622009-05-25 21:10:36 +00002962/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002964ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002965{
2966 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002967
Georg Brandl0c315622009-05-25 21:10:36 +00002968 REQ(n, with_item);
2969 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002970 if (!context_expr)
2971 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002972 if (NCH(n) == 3) {
2973 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974
2975 if (!optional_vars) {
2976 return NULL;
2977 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002978 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002979 return NULL;
2980 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002981 }
2982
Georg Brandl0c315622009-05-25 21:10:36 +00002983 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002985}
2986
Georg Brandl0c315622009-05-25 21:10:36 +00002987/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2988static stmt_ty
2989ast_for_with_stmt(struct compiling *c, const node *n)
2990{
2991 int i;
2992 stmt_ty ret;
2993 asdl_seq *inner;
2994
2995 REQ(n, with_stmt);
2996
2997 /* process the with items inside-out */
2998 i = NCH(n) - 1;
2999 /* the suite of the innermost with item is the suite of the with stmt */
3000 inner = ast_for_suite(c, CHILD(n, i));
3001 if (!inner)
3002 return NULL;
3003
3004 for (;;) {
3005 i -= 2;
3006 ret = ast_for_with_item(c, CHILD(n, i), inner);
3007 if (!ret)
3008 return NULL;
3009 /* was this the last item? */
3010 if (i == 1)
3011 break;
3012 /* if not, wrap the result so far in a new sequence */
3013 inner = asdl_seq_new(1, c->c_arena);
3014 if (!inner)
3015 return NULL;
3016 asdl_seq_SET(inner, 0, ret);
3017 }
3018
3019 return ret;
3020}
3021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003023ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003025 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003026 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003027 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003028 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030 REQ(n, classdef);
3031
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003032 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 s = ast_for_suite(c, CHILD(n, 3));
3034 if (!s)
3035 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003036 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 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003042
3043 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003044 s = ast_for_suite(c, CHILD(n,5));
3045 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003046 return NULL;
3047 classname = NEW_IDENTIFIER(CHILD(n, 1));
3048 if (!classname)
3049 return NULL;
3050 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3051 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 }
3053
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003054 /* class NAME '(' arglist ')' ':' suite */
3055 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003056 {
3057 PyObject *dummy_name;
3058 expr_ty dummy;
3059 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3060 if (!dummy_name)
3061 return NULL;
3062 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3063 call = ast_for_call(c, CHILD(n, 3), dummy);
3064 if (!call)
3065 return NULL;
3066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003068 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003070 classname = NEW_IDENTIFIER(CHILD(n, 1));
3071 if (!classname)
3072 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003073
Benjamin Peterson30760062008-11-25 04:02:28 +00003074 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003075 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003076 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077}
3078
3079static stmt_ty
3080ast_for_stmt(struct compiling *c, const node *n)
3081{
3082 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 assert(NCH(n) == 1);
3084 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 }
3086 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003087 assert(num_stmts(n) == 1);
3088 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 }
3090 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003091 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003092 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3093 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003094 */
3095 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 case expr_stmt:
3097 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 case del_stmt:
3099 return ast_for_del_stmt(c, n);
3100 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003101 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 case flow_stmt:
3103 return ast_for_flow_stmt(c, n);
3104 case import_stmt:
3105 return ast_for_import_stmt(c, n);
3106 case global_stmt:
3107 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003108 case nonlocal_stmt:
3109 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 case assert_stmt:
3111 return ast_for_assert_stmt(c, n);
3112 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003113 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3115 TYPE(n), NCH(n));
3116 return NULL;
3117 }
3118 }
3119 else {
3120 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003121 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003122 */
3123 node *ch = CHILD(n, 0);
3124 REQ(n, compound_stmt);
3125 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 case if_stmt:
3127 return ast_for_if_stmt(c, ch);
3128 case while_stmt:
3129 return ast_for_while_stmt(c, ch);
3130 case for_stmt:
3131 return ast_for_for_stmt(c, ch);
3132 case try_stmt:
3133 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003134 case with_stmt:
3135 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003137 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003139 return ast_for_classdef(c, ch, NULL);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003140 case decorated:
3141 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003143 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3145 TYPE(n), NCH(n));
3146 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 }
3149}
3150
3151static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003152parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 const char *end;
3155 long x;
3156 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003158 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160#endif
3161
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003162 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003163 errno = 0;
3164 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 if (s[0] == '0') {
3169 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3170 if (x < 0 && errno == 0) {
3171 return PyLong_FromString((char *)s,
3172 (char **)0,
3173 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003174 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 }
3176 else
3177 x = PyOS_strtol((char *)s, (char **)&end, 0);
3178 if (*end == '\0') {
3179 if (errno != 0)
3180 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003181 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 }
3183 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003185 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003186 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003187 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3188 if (compl.imag == -1.0 && PyErr_Occurred())
3189 return NULL;
3190 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003191 }
3192 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003195 dx = PyOS_string_to_double(s, NULL, NULL);
3196 if (dx == -1.0 && PyErr_Occurred())
3197 return NULL;
3198 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003199 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200}
3201
3202static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003203decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 PyObject *u, *v;
3206 char *s, *t;
3207 t = s = (char *)*sPtr;
3208 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3209 while (s < end && (*s & 0x80)) s++;
3210 *sPtr = s;
3211 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3212 if (u == NULL)
3213 return NULL;
3214 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3215 Py_DECREF(u);
3216 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217}
3218
3219static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003220decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003221{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003222 PyObject *v, *u;
3223 char *buf;
3224 char *p;
3225 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003226
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 if (encoding == NULL) {
3228 buf = (char *)s;
3229 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003231 /* check for integer overflow */
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003232 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003233 return NULL;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003234 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3235 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3236 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 if (u == NULL)
3238 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003239 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 end = s + len;
3241 while (s < end) {
3242 if (*s == '\\') {
3243 *p++ = *s++;
3244 if (*s & 0x80) {
3245 strcpy(p, "u005c");
3246 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003247 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003248 }
3249 if (*s & 0x80) { /* XXX inefficient */
3250 PyObject *w;
3251 char *r;
3252 Py_ssize_t rn, i;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003253 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003254 if (w == NULL) {
3255 Py_DECREF(u);
3256 return NULL;
3257 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003258 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003259 rn = Py_SIZE(w);
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003260 assert(rn % 4 == 0);
3261 for (i = 0; i < rn; i += 4) {
3262 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 r[i + 0] & 0xFF,
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003264 r[i + 1] & 0xFF,
3265 r[i + 2] & 0xFF,
3266 r[i + 3] & 0xFF);
3267 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003268 }
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003269 /* Should be impossible to overflow */
3270 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 Py_DECREF(w);
3272 } else {
3273 *p++ = *s++;
3274 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003275 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 len = p - buf;
3277 s = buf;
3278 }
3279 if (rawmode)
3280 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3281 else
3282 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3283 Py_XDECREF(u);
3284 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285}
3286
3287/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003288 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 * parsestr parses it, and returns the decoded Python string object.
3290 */
3291static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003292parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294 size_t len;
3295 const char *s = STR(n);
3296 int quote = Py_CHARMASK(*s);
3297 int rawmode = 0;
3298 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003299 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003300 if (quote == 'b' || quote == 'B') {
3301 quote = *++s;
3302 *bytesmode = 1;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003303 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003304 if (quote == 'r' || quote == 'R') {
3305 quote = *++s;
3306 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003307 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003308 }
3309 if (quote != '\'' && quote != '\"') {
3310 PyErr_BadInternalCall();
3311 return NULL;
3312 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 s++;
3314 len = strlen(s);
3315 if (len > INT_MAX) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003316 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 "string to parse is too long");
3318 return NULL;
3319 }
3320 if (s[--len] != quote) {
3321 PyErr_BadInternalCall();
3322 return NULL;
3323 }
3324 if (len >= 4 && s[0] == quote && s[1] == quote) {
3325 s += 2;
3326 len -= 2;
3327 if (s[--len] != quote || s[--len] != quote) {
3328 PyErr_BadInternalCall();
3329 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003330 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003331 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003332 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003333 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003334 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003335 if (*bytesmode) {
3336 /* Disallow non-ascii characters (but not escapes) */
3337 const char *c;
3338 for (c = s; *c; c++) {
3339 if (Py_CHARMASK(*c) >= 0x80) {
3340 ast_error(n, "bytes can only contain ASCII "
3341 "literal characters.");
3342 return NULL;
3343 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003344 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003345 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003346 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003347 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003348 if (rawmode || strchr(s, '\\') == NULL) {
3349 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003350 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003351 if (u == NULL || !*bytesmode)
3352 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003353 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003354 Py_DECREF(u);
3355 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003356 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003357 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003358 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003359 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003360 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003361 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003362 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003363 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003364 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003365 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366}
3367
Guido van Rossum29fd7122007-11-12 01:13:56 +00003368/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369 * compile-time literal catenation, calling parsestr() on each piece, and
3370 * pasting the intermediate results together.
3371 */
3372static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003373parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003375 PyObject *v;
3376 int i;
3377 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003378 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003379 if (v != NULL) {
3380 /* String literal concatenation */
3381 for (i = 1; i < NCH(n); i++) {
3382 PyObject *s;
3383 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003384 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003385 if (s == NULL)
3386 goto onError;
3387 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003388 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003389 goto onError;
3390 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003391 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3392 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003393 if (v == NULL)
3394 goto onError;
3395 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003396 else {
3397 PyObject *temp = PyUnicode_Concat(v, s);
3398 Py_DECREF(s);
3399 Py_DECREF(v);
3400 v = temp;
3401 if (v == NULL)
3402 goto onError;
3403 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003404 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003405 }
3406 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407
Guido van Rossumd8faa362007-04-27 19:54:29 +00003408 onError:
3409 Py_XDECREF(v);
3410 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411}