blob: d2f063bb5ba61db8c7754ef7caf5359459934453 [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"
10#include "ast.h"
11#include "token.h"
12#include "parsetok.h"
13#include "graminit.h"
14
15#include <assert.h>
16
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017/* Data structure used internally */
18struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000019 char *c_encoding; /* source encoding */
20 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000021 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022};
23
24static asdl_seq *seq_for_testlist(struct compiling *, const node *);
25static expr_ty ast_for_expr(struct compiling *, const node *);
26static stmt_ty ast_for_stmt(struct compiling *, const node *);
27static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000028static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
29 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000030static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000031static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000032
33/* Note different signature for ast_for_call */
34static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
35
Christian Heimes81ee3ef2008-05-04 22:42:01 +000036static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000037static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestrplus(struct compiling *, const node *n,
39 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000040
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000042#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043#endif
44
Nick Coghlan650f0d02007-04-15 12:05:43 +000045#define COMP_GENEXP 0
46#define COMP_LISTCOMP 1
47#define COMP_SETCOMP 2
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
Benjamin Petersonc7dedb02012-09-02 16:36:01 -040050new_identifier(const char *n, PyArena *arena)
Martin v. Löwis47383402007-08-15 07:32:56 +000051{
Benjamin Petersonc7dedb02012-09-02 16:36:01 -040052 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000053 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000054 if (!id)
55 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000056 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000057 /* Check whether there are non-ASCII characters in the
58 identifier; if so, normalize to NFKC. */
59 for (; *u; u++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 if (*u >= 128) {
61 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
62 PyObject *id2;
63 if (!m)
64 return NULL;
65 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
66 Py_DECREF(m);
67 if (!id2)
68 return NULL;
69 Py_DECREF(id);
70 id = id2;
71 break;
72 }
Martin v. Löwis47383402007-08-15 07:32:56 +000073 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000074 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000075 PyArena_AddPyObject(arena, id);
76 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077}
78
Neal Norwitzadb69fc2005-12-17 20:54:49 +000079#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81/* This routine provides an invalid object for the syntax error.
82 The outermost routine must unpack this error and create the
83 proper object. We do this so that we don't have to pass
84 the filename to everything function.
85
86 XXX Maybe we should just pass the filename...
87*/
88
89static int
90ast_error(const node *n, const char *errstr)
91{
Benjamin Petersonc5d75182012-09-02 14:38:08 -040092 PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset), *save;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000094 return 0;
Benjamin Peterson2e2c9032012-09-02 14:23:15 -040095 /*
96 * Prevent the error from being chained. PyErr_SetObject will normalize the
97 * exception in order to chain it. ast_error_finish, however, requires the
98 * error not to be normalized.
99 */
Benjamin Petersonc5d75182012-09-02 14:38:08 -0400100 save = PyThreadState_GET()->exc_value;
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400101 PyThreadState_GET()->exc_value = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000102 PyErr_SetObject(PyExc_SyntaxError, u);
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400103 PyThreadState_GET()->exc_value = save;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000104 Py_DECREF(u);
105 return 0;
106}
107
108static void
109ast_error_finish(const char *filename)
110{
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000111 PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000112 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000113 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114
115 assert(PyErr_Occurred());
116 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000117 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
119 PyErr_Fetch(&type, &value, &tback);
120 errstr = PyTuple_GetItem(value, 0);
121 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000124 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000125 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000126 Py_DECREF(errstr);
127 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000128 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000129 offset = PyTuple_GetItem(value, 2);
130 if (!offset) {
131 Py_DECREF(errstr);
132 return;
133 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134 Py_DECREF(value);
135
136 loc = PyErr_ProgramText(filename, lineno);
137 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 Py_INCREF(Py_None);
139 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140 }
Victor Stinner2f2ed1f2010-10-16 13:42:53 +0000141 if (filename != NULL)
142 filename_obj = PyUnicode_DecodeFSDefault(filename);
143 else {
144 Py_INCREF(Py_None);
145 filename_obj = Py_None;
146 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000147 if (filename_obj != NULL)
148 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
149 else
150 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000152 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000153 Py_DECREF(errstr);
154 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000155 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000156 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157 Py_DECREF(errstr);
158 Py_DECREF(tmp);
159 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000160 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000161 PyErr_Restore(type, value, tback);
162}
163
164/* num_stmts() returns number of contained statements.
165
166 Use this routine to determine how big a sequence is needed for
167 the statements in a parse tree. Its raison d'etre is this bit of
168 grammar:
169
170 stmt: simple_stmt | compound_stmt
171 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
172
173 A simple_stmt can contain multiple small_stmt elements joined
174 by semicolons. If the arg is a simple_stmt, the number of
175 small_stmt elements is returned.
176*/
177
178static int
179num_stmts(const node *n)
180{
181 int i, l;
182 node *ch;
183
184 switch (TYPE(n)) {
185 case single_input:
186 if (TYPE(CHILD(n, 0)) == NEWLINE)
187 return 0;
188 else
189 return num_stmts(CHILD(n, 0));
190 case file_input:
191 l = 0;
192 for (i = 0; i < NCH(n); i++) {
193 ch = CHILD(n, i);
194 if (TYPE(ch) == stmt)
195 l += num_stmts(ch);
196 }
197 return l;
198 case stmt:
199 return num_stmts(CHILD(n, 0));
200 case compound_stmt:
201 return 1;
202 case simple_stmt:
203 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
204 case suite:
205 if (NCH(n) == 1)
206 return num_stmts(CHILD(n, 0));
207 else {
208 l = 0;
209 for (i = 2; i < (NCH(n) - 1); i++)
210 l += num_stmts(CHILD(n, i));
211 return l;
212 }
213 default: {
214 char buf[128];
215
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000216 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000217 TYPE(n), NCH(n));
218 Py_FatalError(buf);
219 }
220 }
221 assert(0);
222 return 0;
223}
224
225/* Transform the CST rooted at node * to the appropriate AST
226*/
227
228mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
230 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 asdl_seq *stmts = NULL;
234 stmt_ty s;
235 node *ch;
236 struct compiling c;
237
238 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000239 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000240 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000241#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000242 ast_error(n, "encoding declaration in Unicode string");
243 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000244#endif
245 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000246 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000247 } else if (TYPE(n) == encoding_decl) {
248 c.c_encoding = STR(n);
249 n = CHILD(n, 0);
250 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000252 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000254 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000255 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256
Jeremy Hyltona8293132006-02-28 17:58:27 +0000257 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 switch (TYPE(n)) {
259 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000260 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000262 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000263 for (i = 0; i < NCH(n) - 1; i++) {
264 ch = CHILD(n, i);
265 if (TYPE(ch) == NEWLINE)
266 continue;
267 REQ(ch, stmt);
268 num = num_stmts(ch);
269 if (num == 1) {
270 s = ast_for_stmt(&c, ch);
271 if (!s)
272 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000273 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 }
275 else {
276 ch = CHILD(ch, 0);
277 REQ(ch, simple_stmt);
278 for (j = 0; j < num; j++) {
279 s = ast_for_stmt(&c, CHILD(ch, j * 2));
280 if (!s)
281 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000282 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 }
285 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 case eval_input: {
288 expr_ty testlist_ast;
289
Nick Coghlan650f0d02007-04-15 12:05:43 +0000290 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000291 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 if (!testlist_ast)
293 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000294 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 }
296 case single_input:
297 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000298 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000300 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000301 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
302 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000303 if (!asdl_seq_GET(stmts, 0))
304 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000305 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000306 }
307 else {
308 n = CHILD(n, 0);
309 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000312 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000314 s = ast_for_stmt(&c, n);
315 if (!s)
316 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000317 asdl_seq_SET(stmts, 0, s);
318 }
319 else {
320 /* Only a simple_stmt can contain multiple statements. */
321 REQ(n, simple_stmt);
322 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323 if (TYPE(CHILD(n, i)) == NEWLINE)
324 break;
325 s = ast_for_stmt(&c, CHILD(n, i));
326 if (!s)
327 goto error;
328 asdl_seq_SET(stmts, i / 2, s);
329 }
330 }
331
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000332 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000333 }
334 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000335 PyErr_Format(PyExc_SystemError,
336 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000337 goto error;
338 }
339 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000340 ast_error_finish(filename);
341 return NULL;
342}
343
344/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
345*/
346
347static operator_ty
348get_operator(const node *n)
349{
350 switch (TYPE(n)) {
351 case VBAR:
352 return BitOr;
353 case CIRCUMFLEX:
354 return BitXor;
355 case AMPER:
356 return BitAnd;
357 case LEFTSHIFT:
358 return LShift;
359 case RIGHTSHIFT:
360 return RShift;
361 case PLUS:
362 return Add;
363 case MINUS:
364 return Sub;
365 case STAR:
366 return Mult;
367 case SLASH:
368 return Div;
369 case DOUBLESLASH:
370 return FloorDiv;
371 case PERCENT:
372 return Mod;
373 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000374 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375 }
376}
377
Guido van Rossume7ba4952007-06-06 23:52:48 +0000378static const char* FORBIDDEN[] = {
379 "None",
380 "True",
381 "False",
382 NULL,
383};
384
385static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000386forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000387{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000388 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000389 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
390 ast_error(n, "assignment to keyword");
391 return 1;
392 }
393 if (full_checks) {
394 const char **p;
395 for (p = FORBIDDEN; *p; p++) {
396 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
397 ast_error(n, "assignment to keyword");
398 return 1;
399 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000400 }
401 }
402 return 0;
403}
404
Jeremy Hyltona8293132006-02-28 17:58:27 +0000405/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000406
407 Only sets context for expr kinds that "can appear in assignment context"
408 (according to ../Parser/Python.asdl). For other expr kinds, it sets
409 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000410*/
411
412static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000413set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414{
415 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 /* If a particular expression type can't be used for assign / delete,
417 set expr_name to its name and an error message will be generated.
418 */
419 const char* expr_name = NULL;
420
421 /* The ast defines augmented store and load contexts, but the
422 implementation here doesn't actually use them. The code may be
423 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000424 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000425 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000426 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000427 */
428 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429
430 switch (e->kind) {
431 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000432 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000433 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
434 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000435 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 e->v.Subscript.ctx = ctx;
438 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000439 case Starred_kind:
440 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000441 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000442 return 0;
443 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000444 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000445 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000446 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000447 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000448 }
449 e->v.Name.ctx = ctx;
450 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452 e->v.List.ctx = ctx;
453 s = e->v.List.elts;
454 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000455 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000456 if (asdl_seq_LEN(e->v.Tuple.elts)) {
457 e->v.Tuple.ctx = ctx;
458 s = e->v.Tuple.elts;
459 }
460 else {
461 expr_name = "()";
462 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000463 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 case Lambda_kind:
465 expr_name = "lambda";
466 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000469 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000470 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000471 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 case UnaryOp_kind:
473 expr_name = "operator";
474 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000476 expr_name = "generator expression";
477 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000478 case Yield_kind:
479 expr_name = "yield expression";
480 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000481 case ListComp_kind:
482 expr_name = "list comprehension";
483 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000484 case SetComp_kind:
485 expr_name = "set comprehension";
486 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000487 case DictComp_kind:
488 expr_name = "dict comprehension";
489 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000490 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000491 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492 case Num_kind:
493 case Str_kind:
Benjamin Petersonbd3e3622011-04-12 18:33:28 -0500494 case Bytes_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000495 expr_name = "literal";
496 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000497 case Ellipsis_kind:
498 expr_name = "Ellipsis";
499 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000500 case Compare_kind:
501 expr_name = "comparison";
502 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000503 case IfExp_kind:
504 expr_name = "conditional expression";
505 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000506 default:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 PyErr_Format(PyExc_SystemError,
508 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000509 e->kind, e->lineno);
510 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000511 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000512 /* Check for error string set by switch */
513 if (expr_name) {
514 char buf[300];
515 PyOS_snprintf(buf, sizeof(buf),
516 "can't %s %s",
517 ctx == Store ? "assign to" : "delete",
518 expr_name);
519 return ast_error(n, buf);
520 }
521
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522 /* If the LHS is a list or tuple, we need to set the assignment
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524 */
525 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000526 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527
Thomas Wouters89f507f2006-12-13 04:49:30 +0000528 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000529 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000530 return 0;
531 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000532 }
533 return 1;
534}
535
536static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000537ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538{
539 REQ(n, augassign);
540 n = CHILD(n, 0);
541 switch (STR(n)[0]) {
542 case '+':
543 return Add;
544 case '-':
545 return Sub;
546 case '/':
547 if (STR(n)[1] == '/')
548 return FloorDiv;
549 else
550 return Div;
551 case '%':
552 return Mod;
553 case '<':
554 return LShift;
555 case '>':
556 return RShift;
557 case '&':
558 return BitAnd;
559 case '^':
560 return BitXor;
561 case '|':
562 return BitOr;
563 case '*':
564 if (STR(n)[1] == '*')
565 return Pow;
566 else
567 return Mult;
568 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000569 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571 }
572}
573
574static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000575ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000577 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000578 |'is' 'not'
579 */
580 REQ(n, comp_op);
581 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 n = CHILD(n, 0);
583 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 case LESS:
585 return Lt;
586 case GREATER:
587 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000588 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 return Eq;
590 case LESSEQUAL:
591 return LtE;
592 case GREATEREQUAL:
593 return GtE;
594 case NOTEQUAL:
595 return NotEq;
596 case NAME:
597 if (strcmp(STR(n), "in") == 0)
598 return In;
599 if (strcmp(STR(n), "is") == 0)
600 return Is;
601 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000602 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000604 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000605 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 }
607 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 /* handle "not in" and "is not" */
609 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610 case NAME:
611 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
612 return NotIn;
613 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
614 return IsNot;
615 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000616 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000618 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000619 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 }
Neal Norwitz79792652005-11-14 04:25:03 +0000621 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000623 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624}
625
626static asdl_seq *
627seq_for_testlist(struct compiling *c, const node *n)
628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* testlist: test (',' test)* [',']
Benjamin Peterson4905e802009-09-27 02:43:28 +0000630 testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
631 */
Armin Rigo31441302005-10-21 12:57:31 +0000632 asdl_seq *seq;
633 expr_ty expression;
634 int i;
Benjamin Peterson4905e802009-09-27 02:43:28 +0000635 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000637 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638 if (!seq)
639 return NULL;
640
641 for (i = 0; i < NCH(n); i += 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 const node *ch = CHILD(n, i);
Benjamin Peterson4905e802009-09-27 02:43:28 +0000643 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000644
Benjamin Peterson4905e802009-09-27 02:43:28 +0000645 expression = ast_for_expr(c, ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000646 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648
649 assert(i / 2 < seq->size);
650 asdl_seq_SET(seq, i / 2, expression);
651 }
652 return seq;
653}
654
Neal Norwitzc1505362006-12-28 06:47:50 +0000655static arg_ty
Benjamin Petersonbc4665e2012-03-12 11:00:41 -0700656ast_for_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000657{
658 identifier name;
659 expr_ty annotation = NULL;
660 node *ch;
661
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000662 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000663 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000664 name = NEW_IDENTIFIER(ch);
665 if (!name)
666 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000667 if (forbidden_name(name, ch, 0))
668 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000669
670 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
671 annotation = ast_for_expr(c, CHILD(n, 2));
672 if (!annotation)
673 return NULL;
674 }
675
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000676 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677}
678
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679/* returns -1 if failed to handle keyword only arguments
680 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000681 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000682 ^^^
683 start pointing here
684 */
685static int
686handle_keywordonly_args(struct compiling *c, const node *n, int start,
687 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
688{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000689 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000690 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000691 expr_ty expression, annotation;
692 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000693 int i = start;
694 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000695
696 if (kwonlyargs == NULL) {
697 ast_error(CHILD(n, start), "named arguments must follow bare *");
698 return -1;
699 }
700 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000701 while (i < NCH(n)) {
702 ch = CHILD(n, i);
703 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000704 case vfpdef:
705 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000706 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000707 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000708 if (!expression)
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000709 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000710 asdl_seq_SET(kwdefaults, j, expression);
711 i += 2; /* '=' and test */
712 }
713 else { /* setting NULL if no default value exists */
714 asdl_seq_SET(kwdefaults, j, NULL);
715 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000716 if (NCH(ch) == 3) {
717 /* ch is NAME ':' test */
718 annotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000719 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 }
722 else {
723 annotation = NULL;
724 }
725 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000726 argname = NEW_IDENTIFIER(ch);
727 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000728 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000729 if (forbidden_name(argname, ch, 0))
730 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000731 arg = arg(argname, annotation, c->c_arena);
732 if (!arg)
733 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000734 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 i += 2; /* the name and the comma */
736 break;
737 case DOUBLESTAR:
738 return i;
739 default:
740 ast_error(ch, "unexpected node");
741 goto error;
742 }
743 }
744 return i;
745 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748
Jeremy Hyltona8293132006-02-28 17:58:27 +0000749/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
751static arguments_ty
752ast_for_arguments(struct compiling *c, const node *n)
753{
Neal Norwitzc1505362006-12-28 06:47:50 +0000754 /* This function handles both typedargslist (function definition)
755 and varargslist (lambda definition).
756
757 parameters: '(' [typedargslist] ')'
758 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000760 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000761 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000762 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000763 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000765 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000767 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 int i, j, k, nposargs = 0, nkwonlyargs = 0;
770 int nposdefaults = 0, found_default = 0;
771 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000773 arg_ty arg;
774 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 node *ch;
776
777 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000779 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
780 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784
Jeremy Hyltone921e022008-07-17 16:37:17 +0000785 /* First count the number of positional args & defaults. The
786 variable i is the loop index for this for loop and the next.
787 The next loop picks up where the first leaves off.
788 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000790 ch = CHILD(n, i);
791 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000792 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000793 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000794 if (i < NCH(n) && /* skip argument following star */
795 (TYPE(CHILD(n, i)) == tfpdef ||
796 TYPE(CHILD(n, i)) == vfpdef)) {
797 i++;
798 }
799 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000801 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000802 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000806 defaults for keyword only args */
807 for ( ; i < NCH(n); ++i) {
808 ch = CHILD(n, i);
809 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000810 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000811 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
813 if (!posargs && nposargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000814 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000815 kwonlyargs = (nkwonlyargs ?
816 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
817 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000818 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
821 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000822 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 since we set NULL as default for keyword only argument w/o default
825 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000826 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000827 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
828 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000829 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830
831 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000832 ast_error(n, "more than 255 arguments");
833 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000836 /* tfpdef: NAME [':' test]
837 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 */
839 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000840 j = 0; /* index for defaults */
841 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000842 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000843 ch = CHILD(n, i);
844 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 case tfpdef:
846 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000847 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
848 anything other than EQUAL or a comma? */
849 /* XXX Should NCH(n) check be made a separate check? */
850 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000851 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
852 if (!expression)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000853 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000854 assert(posdefaults != NULL);
855 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 else if (found_default) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000861 "non-default argument follows default argument");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000862 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000863 }
Benjamin Petersonbc4665e2012-03-12 11:00:41 -0700864 arg = ast_for_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000865 if (!arg)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000866 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000867 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868 i += 2; /* the name and the comma */
869 break;
870 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000871 if (i+1 >= NCH(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000873 "named arguments must follow bare *");
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000874 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000875 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000876 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000877 if (TYPE(ch) == COMMA) {
878 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000879 i += 2; /* now follows keyword only arguments */
880 res = handle_keywordonly_args(c, n, i,
881 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000882 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000883 i = res; /* res has new position to process */
884 }
885 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000886 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000887 if (!vararg)
888 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000889 if (forbidden_name(vararg, CHILD(ch, 0), 0))
890 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000891 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000892 /* there is an annotation on the vararg */
893 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000894 if (!varargannotation)
895 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000896 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000897 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000898 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
899 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000900 int res = 0;
901 res = handle_keywordonly_args(c, n, i,
902 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000903 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000904 i = res; /* res has new position to process */
905 }
906 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907 break;
908 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000909 ch = CHILD(n, i+1); /* tfpdef */
910 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000911 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000912 if (!kwarg)
913 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000914 if (NCH(ch) > 1) {
915 /* there is an annotation on the kwarg */
916 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000917 if (!kwargannotation)
918 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000919 }
Benjamin Peterson70f52762009-06-28 23:32:44 +0000920 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000921 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 i += 3;
923 break;
924 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000925 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 "unexpected node in varargslist: %d @ %d",
927 TYPE(ch), i);
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +0000928 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000929 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000930 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000931 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
932 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933}
934
935static expr_ty
936ast_for_dotted_name(struct compiling *c, const node *n)
937{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000938 expr_ty e;
939 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000940 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 int i;
942
943 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000944
945 lineno = LINENO(n);
946 col_offset = n->n_col_offset;
947
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948 id = NEW_IDENTIFIER(CHILD(n, 0));
949 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000950 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000951 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954
955 for (i = 2; i < NCH(n); i+=2) {
956 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000957 if (!id)
958 return NULL;
959 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
960 if (!e)
961 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 }
963
964 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965}
966
967static expr_ty
968ast_for_decorator(struct compiling *c, const node *n)
969{
970 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
971 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000972 expr_ty name_expr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000975 REQ(CHILD(n, 0), AT);
976 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
979 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000980 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000983 d = name_expr;
984 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 }
986 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000987 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000988 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000989 if (!d)
990 return NULL;
991 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 }
993 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994 d = ast_for_call(c, CHILD(n, 3), name_expr);
995 if (!d)
996 return NULL;
997 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 }
999
1000 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001}
1002
1003static asdl_seq*
1004ast_for_decorators(struct compiling *c, const node *n)
1005{
Neal Norwitz84456bd2005-12-18 03:16:20 +00001006 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001007 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001011 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 if (!decorator_seq)
1013 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001016 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001017 if (!d)
1018 return NULL;
1019 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020 }
1021 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022}
1023
1024static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001025ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001027 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001028 identifier name;
1029 arguments_ty args;
1030 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001031 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001032 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033
1034 REQ(n, funcdef);
1035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 name = NEW_IDENTIFIER(CHILD(n, name_i));
1037 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001038 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001039 if (forbidden_name(name, CHILD(n, name_i), 0))
1040 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1042 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001043 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001044 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1045 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1046 if (!returns)
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00001047 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001048 name_i += 2;
1049 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 body = ast_for_suite(c, CHILD(n, name_i + 3));
1051 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001052 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053
Neal Norwitzc1505362006-12-28 06:47:50 +00001054 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001055 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056}
1057
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001058static stmt_ty
1059ast_for_decorated(struct compiling *c, const node *n)
1060{
1061 /* decorated: decorators (classdef | funcdef) */
1062 stmt_ty thing = NULL;
1063 asdl_seq *decorator_seq = NULL;
1064
1065 REQ(n, decorated);
1066
1067 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1068 if (!decorator_seq)
1069 return NULL;
1070
1071 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001073
1074 if (TYPE(CHILD(n, 1)) == funcdef) {
1075 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1076 } else if (TYPE(CHILD(n, 1)) == classdef) {
1077 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1078 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001079 /* we count the decorators in when talking about the class' or
1080 * function's line number */
1081 if (thing) {
1082 thing->lineno = LINENO(n);
1083 thing->col_offset = n->n_col_offset;
1084 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001085 return thing;
1086}
1087
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088static expr_ty
1089ast_for_lambdef(struct compiling *c, const node *n)
1090{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001091 /* lambdef: 'lambda' [varargslist] ':' test
1092 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093 arguments_ty args;
1094 expr_ty expression;
1095
1096 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001097 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1098 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099 if (!args)
1100 return NULL;
1101 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001102 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104 }
1105 else {
1106 args = ast_for_arguments(c, CHILD(n, 1));
1107 if (!args)
1108 return NULL;
1109 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001110 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112 }
1113
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001114 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115}
1116
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001117static expr_ty
1118ast_for_ifexpr(struct compiling *c, const node *n)
1119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001121 expr_ty expression, body, orelse;
1122
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001123 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001124 body = ast_for_expr(c, CHILD(n, 0));
1125 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001126 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001127 expression = ast_for_expr(c, CHILD(n, 2));
1128 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001129 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001130 orelse = ast_for_expr(c, CHILD(n, 4));
1131 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001132 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001133 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1134 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001135}
1136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001138 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139
Nick Coghlan650f0d02007-04-15 12:05:43 +00001140 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141*/
1142
1143static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001144count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Guido van Rossumd8faa362007-04-27 19:54:29 +00001148 count_comp_for:
1149 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001150 REQ(n, comp_for);
1151 if (NCH(n) == 5)
1152 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001153 else
1154 return n_fors;
1155 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001156 REQ(n, comp_iter);
1157 n = CHILD(n, 0);
1158 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001159 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001160 else if (TYPE(n) == comp_if) {
1161 if (NCH(n) == 3) {
1162 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001164 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001165 else
1166 return n_fors;
1167 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001168
Guido van Rossumd8faa362007-04-27 19:54:29 +00001169 /* Should never be reached */
1170 PyErr_SetString(PyExc_SystemError,
1171 "logic error in count_comp_fors");
1172 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173}
1174
Nick Coghlan650f0d02007-04-15 12:05:43 +00001175/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178*/
1179
1180static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001181count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001183 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184
Guido van Rossumd8faa362007-04-27 19:54:29 +00001185 while (1) {
1186 REQ(n, comp_iter);
1187 if (TYPE(CHILD(n, 0)) == comp_for)
1188 return n_ifs;
1189 n = CHILD(n, 0);
1190 REQ(n, comp_if);
1191 n_ifs++;
1192 if (NCH(n) == 2)
1193 return n_ifs;
1194 n = CHILD(n, 2);
1195 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196}
1197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198static asdl_seq *
1199ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001201 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001202 asdl_seq *comps;
1203
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001204 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 if (n_fors == -1)
1206 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207
Nick Coghlan650f0d02007-04-15 12:05:43 +00001208 comps = asdl_seq_new(n_fors, c->c_arena);
1209 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001211
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001213 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001215 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001216 node *for_ch;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217
Guido van Rossum992d4a32007-07-11 13:09:30 +00001218 REQ(n, comp_for);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219
Guido van Rossum992d4a32007-07-11 13:09:30 +00001220 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001221 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001224 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001225 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001227
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 /* Check the # of children rather than the length of t, since
1229 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001230 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001231 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001232 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001234 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1235 c->c_arena),
1236 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001237 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001239
Guido van Rossum992d4a32007-07-11 13:09:30 +00001240 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241 int j, n_ifs;
1242 asdl_seq *ifs;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243
Guido van Rossum992d4a32007-07-11 13:09:30 +00001244 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001245 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001246 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001247 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001248
1249 ifs = asdl_seq_new(n_ifs, c->c_arena);
1250 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001252
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001254 REQ(n, comp_iter);
1255 n = CHILD(n, 0);
1256 REQ(n, comp_if);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257
Guido van Rossum992d4a32007-07-11 13:09:30 +00001258 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001259 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001260 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001261 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001262 if (NCH(n) == 3)
1263 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001265 /* on exit, must guarantee that n is a comp_for */
1266 if (TYPE(n) == comp_iter)
1267 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001268 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001270 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001272 return comps;
1273}
1274
1275static expr_ty
1276ast_for_itercomp(struct compiling *c, const node *n, int type)
1277{
1278 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1279 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1280 expr_ty elt;
1281 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282
Guido van Rossum992d4a32007-07-11 13:09:30 +00001283 assert(NCH(n) > 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284
Guido van Rossum992d4a32007-07-11 13:09:30 +00001285 elt = ast_for_expr(c, CHILD(n, 0));
1286 if (!elt)
1287 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288
Guido van Rossum992d4a32007-07-11 13:09:30 +00001289 comps = ast_for_comprehension(c, CHILD(n, 1));
1290 if (!comps)
1291 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001292
1293 if (type == COMP_GENEXP)
1294 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1295 else if (type == COMP_LISTCOMP)
1296 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1297 else if (type == COMP_SETCOMP)
1298 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1299 else
1300 /* Should never happen */
1301 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302}
1303
1304static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001305ast_for_dictcomp(struct compiling *c, const node *n)
1306{
1307 expr_ty key, value;
1308 asdl_seq *comps;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309
Guido van Rossum992d4a32007-07-11 13:09:30 +00001310 assert(NCH(n) > 3);
1311 REQ(CHILD(n, 1), COLON);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312
Guido van Rossum992d4a32007-07-11 13:09:30 +00001313 key = ast_for_expr(c, CHILD(n, 0));
1314 if (!key)
1315 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001316 value = ast_for_expr(c, CHILD(n, 2));
1317 if (!value)
1318 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319
Guido van Rossum992d4a32007-07-11 13:09:30 +00001320 comps = ast_for_comprehension(c, CHILD(n, 3));
1321 if (!comps)
1322 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323
Guido van Rossum992d4a32007-07-11 13:09:30 +00001324 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1325}
1326
1327static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001328ast_for_genexp(struct compiling *c, const node *n)
1329{
1330 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001331 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001332}
1333
1334static expr_ty
1335ast_for_listcomp(struct compiling *c, const node *n)
1336{
1337 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001338 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001339}
1340
1341static expr_ty
1342ast_for_setcomp(struct compiling *c, const node *n)
1343{
1344 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001345 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001346}
1347
1348
1349static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350ast_for_atom(struct compiling *c, const node *n)
1351{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001352 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1353 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001354 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 */
1356 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001357 int bytesmode = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001360 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 /* All names start in Load context, but may later be
1362 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001363 PyObject *name = NEW_IDENTIFIER(ch);
1364 if (!name)
1365 return NULL;
1366 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1367 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001369 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001370 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001371 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001372 PyObject *type, *value, *tback, *errstr;
1373 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001374 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001375 if (errstr) {
1376 char *s = "";
1377 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001378 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001379 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1380 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001381 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001382 } else {
1383 ast_error(n, "(unicode error) unknown error");
1384 }
1385 Py_DECREF(type);
1386 Py_DECREF(value);
1387 Py_XDECREF(tback);
1388 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001389 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001390 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001391 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001392 if (bytesmode)
1393 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1394 else
1395 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 }
1397 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001398 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001399 if (!pynum)
1400 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001401
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 PyArena_AddPyObject(c->c_arena, pynum);
1403 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404 }
Georg Brandldde00282007-03-18 19:01:53 +00001405 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001406 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (TYPE(ch) == RPAR)
1411 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 if (TYPE(ch) == yield_expr)
1414 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001417 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001418 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001419
Nick Coghlan650f0d02007-04-15 12:05:43 +00001420 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001421 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001422 ch = CHILD(n, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423
Thomas Wouters89f507f2006-12-13 04:49:30 +00001424 if (TYPE(ch) == RSQB)
1425 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426
Nick Coghlan650f0d02007-04-15 12:05:43 +00001427 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001428 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1429 asdl_seq *elts = seq_for_testlist(c, ch);
1430 if (!elts)
1431 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001432
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1434 }
1435 else
1436 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001438 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1439 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001440 int i, size;
1441 asdl_seq *keys, *values;
1442
1443 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001444 if (TYPE(ch) == RBRACE) {
1445 /* it's an empty dict */
1446 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1447 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1448 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001449 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001451 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001452 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001453 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001454 for (i = 0; i < NCH(ch); i += 2) {
1455 expr_ty expression;
1456 expression = ast_for_expr(c, CHILD(ch, i));
1457 if (!expression)
1458 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001459 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001460 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001461 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1462 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1463 /* it's a set comprehension */
1464 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001465 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1466 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001467 } else {
1468 /* it's a dict */
1469 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1470 keys = asdl_seq_new(size, c->c_arena);
1471 if (!keys)
1472 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473
Guido van Rossum86e58e22006-08-28 15:27:34 +00001474 values = asdl_seq_new(size, c->c_arena);
1475 if (!values)
1476 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477
Guido van Rossum86e58e22006-08-28 15:27:34 +00001478 for (i = 0; i < NCH(ch); i += 4) {
1479 expr_ty expression;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480
Guido van Rossum86e58e22006-08-28 15:27:34 +00001481 expression = ast_for_expr(c, CHILD(ch, i));
1482 if (!expression)
1483 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001484
Guido van Rossum86e58e22006-08-28 15:27:34 +00001485 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001486
Guido van Rossum86e58e22006-08-28 15:27:34 +00001487 expression = ast_for_expr(c, CHILD(ch, i + 2));
1488 if (!expression)
1489 return NULL;
1490
1491 asdl_seq_SET(values, i / 4, expression);
1492 }
1493 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001497 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1498 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 }
1500}
1501
1502static slice_ty
1503ast_for_slice(struct compiling *c, const node *n)
1504{
1505 node *ch;
1506 expr_ty lower = NULL, upper = NULL, step = NULL;
1507
1508 REQ(n, subscript);
1509
1510 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001511 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 sliceop: ':' [test]
1513 */
1514 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515 if (NCH(n) == 1 && TYPE(ch) == test) {
1516 /* 'step' variable hold no significance in terms of being used over
1517 other vars */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 if (!step)
1520 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521
Thomas Wouters89f507f2006-12-13 04:49:30 +00001522 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523 }
1524
1525 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001526 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527 if (!lower)
1528 return NULL;
1529 }
1530
1531 /* If there's an upper bound it's in the second or third position. */
1532 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533 if (NCH(n) > 1) {
1534 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535
Thomas Wouters89f507f2006-12-13 04:49:30 +00001536 if (TYPE(n2) == test) {
1537 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538 if (!upper)
1539 return NULL;
1540 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001541 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544
Thomas Wouters89f507f2006-12-13 04:49:30 +00001545 if (TYPE(n2) == test) {
1546 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547 if (!upper)
1548 return NULL;
1549 }
1550 }
1551
1552 ch = CHILD(n, NCH(n) - 1);
1553 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001554 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001555 ch = CHILD(ch, 1);
1556 if (TYPE(ch) == test) {
1557 step = ast_for_expr(c, ch);
1558 if (!step)
1559 return NULL;
1560 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561 }
1562 }
1563
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001564 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565}
1566
1567static expr_ty
1568ast_for_binop(struct compiling *c, const node *n)
1569{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 /* Must account for a sequence of expressions.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001572 BinOp(BinOp(A, op, B), op, C).
1573 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 int i, nops;
1576 expr_ty expr1, expr2, result;
1577 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 expr1 = ast_for_expr(c, CHILD(n, 0));
1580 if (!expr1)
1581 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583 expr2 = ast_for_expr(c, CHILD(n, 2));
1584 if (!expr2)
1585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587 newoperator = get_operator(CHILD(n, 1));
1588 if (!newoperator)
1589 return NULL;
1590
1591 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1592 c->c_arena);
1593 if (!result)
1594 return NULL;
1595
1596 nops = (NCH(n) - 1) / 2;
1597 for (i = 1; i < nops; i++) {
1598 expr_ty tmp_result, tmp;
1599 const node* next_oper = CHILD(n, i * 2 + 1);
1600
1601 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001602 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001603 return NULL;
1604
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1606 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001607 return NULL;
1608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001610 LINENO(next_oper), next_oper->n_col_offset,
1611 c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 return NULL;
1614 result = tmp_result;
1615 }
1616 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617}
1618
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001619static expr_ty
1620ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001623 subscriptlist: subscript (',' subscript)* [',']
1624 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1625 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 REQ(n, trailer);
1627 if (TYPE(CHILD(n, 0)) == LPAR) {
1628 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001629 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1630 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001632 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001634 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001635 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1636 if (!attr_id)
1637 return NULL;
1638 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001639 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001640 }
1641 else {
1642 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 REQ(CHILD(n, 2), RSQB);
1644 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001645 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1647 if (!slc)
1648 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001649 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1650 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 }
1652 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001654 by treating the sequence as a tuple literal if there are
1655 no slice features.
1656 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001657 int j;
1658 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001659 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001660 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001661 asdl_seq *slices, *elts;
1662 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001663 if (!slices)
1664 return NULL;
1665 for (j = 0; j < NCH(n); j += 2) {
1666 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001667 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001668 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001669 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001670 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 asdl_seq_SET(slices, j / 2, slc);
1672 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001673 if (!simple) {
1674 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001675 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001676 }
1677 /* extract Index values and put them in a Tuple */
1678 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001679 if (!elts)
1680 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001681 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1682 slc = (slice_ty)asdl_seq_GET(slices, j);
1683 assert(slc->kind == Index_kind && slc->v.Index.value);
1684 asdl_seq_SET(elts, j, slc->v.Index.value);
1685 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001686 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001687 if (!e)
1688 return NULL;
1689 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001690 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001691 }
1692 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001693}
1694
1695static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001696ast_for_factor(struct compiling *c, const node *n)
1697{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001698 expr_ty expression;
1699
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001700 expression = ast_for_expr(c, CHILD(n, 1));
1701 if (!expression)
1702 return NULL;
1703
1704 switch (TYPE(CHILD(n, 0))) {
1705 case PLUS:
1706 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1707 c->c_arena);
1708 case MINUS:
1709 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1710 c->c_arena);
1711 case TILDE:
1712 return UnaryOp(Invert, expression, LINENO(n),
1713 n->n_col_offset, c->c_arena);
1714 }
1715 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1716 TYPE(CHILD(n, 0)));
1717 return NULL;
1718}
1719
1720static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001721ast_for_power(struct compiling *c, const node *n)
1722{
1723 /* power: atom trailer* ('**' factor)*
1724 */
1725 int i;
1726 expr_ty e, tmp;
1727 REQ(n, power);
1728 e = ast_for_atom(c, CHILD(n, 0));
1729 if (!e)
1730 return NULL;
1731 if (NCH(n) == 1)
1732 return e;
1733 for (i = 1; i < NCH(n); i++) {
1734 node *ch = CHILD(n, i);
1735 if (TYPE(ch) != trailer)
1736 break;
1737 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001738 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001739 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001740 tmp->lineno = e->lineno;
1741 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 e = tmp;
1743 }
1744 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1745 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001746 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001747 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001748 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001749 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001750 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001751 e = tmp;
1752 }
1753 return e;
1754}
1755
Guido van Rossum0368b722007-05-11 16:50:42 +00001756static expr_ty
1757ast_for_starred(struct compiling *c, const node *n)
1758{
1759 expr_ty tmp;
1760 REQ(n, star_expr);
1761
1762 tmp = ast_for_expr(c, CHILD(n, 1));
1763 if (!tmp)
1764 return NULL;
1765
1766 /* The Load context is changed later. */
1767 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1768}
1769
1770
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771/* Do not name a variable 'expr'! Will cause a compile error.
1772*/
1773
1774static expr_ty
1775ast_for_expr(struct compiling *c, const node *n)
1776{
1777 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001778 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001779 test_nocond: or_test | lambdef_nocond
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 and_test: not_test ('and' not_test)*
1782 not_test: 'not' not_test | comparison
1783 comparison: expr (comp_op expr)*
1784 expr: xor_expr ('|' xor_expr)*
1785 xor_expr: and_expr ('^' and_expr)*
1786 and_expr: shift_expr ('&' shift_expr)*
1787 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1788 arith_expr: term (('+'|'-') term)*
1789 term: factor (('*'|'/'|'%'|'//') factor)*
1790 factor: ('+'|'-'|'~') factor | power
1791 power: atom trailer* ('**' factor)*
1792 */
1793
1794 asdl_seq *seq;
1795 int i;
1796
1797 loop:
1798 switch (TYPE(n)) {
1799 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001800 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001801 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001802 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001804 else if (NCH(n) > 1)
1805 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001806 /* Fallthrough */
1807 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 case and_test:
1809 if (NCH(n) == 1) {
1810 n = CHILD(n, 0);
1811 goto loop;
1812 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001813 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 if (!seq)
1815 return NULL;
1816 for (i = 0; i < NCH(n); i += 2) {
1817 expr_ty e = ast_for_expr(c, CHILD(n, i));
1818 if (!e)
1819 return NULL;
1820 asdl_seq_SET(seq, i / 2, e);
1821 }
1822 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001823 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1824 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001825 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001826 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 case not_test:
1828 if (NCH(n) == 1) {
1829 n = CHILD(n, 0);
1830 goto loop;
1831 }
1832 else {
1833 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1834 if (!expression)
1835 return NULL;
1836
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1838 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839 }
1840 case comparison:
1841 if (NCH(n) == 1) {
1842 n = CHILD(n, 0);
1843 goto loop;
1844 }
1845 else {
1846 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001847 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001848 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 if (!ops)
1851 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001852 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
1855 }
1856 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001859 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863
1864 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001865 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 asdl_seq_SET(cmps, i / 2, expression);
1871 }
1872 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001873 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001877 return Compare(expression, ops, cmps, LINENO(n),
1878 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 }
1880 break;
1881
Guido van Rossum0368b722007-05-11 16:50:42 +00001882 case star_expr:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 return ast_for_starred(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 /* The next five cases all handle BinOps. The main body of code
1885 is the same in each case, but the switch turned inside out to
1886 reuse the code for each type of operator.
1887 */
1888 case expr:
1889 case xor_expr:
1890 case and_expr:
1891 case shift_expr:
1892 case arith_expr:
1893 case term:
1894 if (NCH(n) == 1) {
1895 n = CHILD(n, 0);
1896 goto loop;
1897 }
1898 return ast_for_binop(c, n);
1899 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001900 expr_ty exp = NULL;
1901 if (NCH(n) == 2) {
1902 exp = ast_for_testlist(c, CHILD(n, 1));
1903 if (!exp)
1904 return NULL;
1905 }
1906 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1907 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001908 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 if (NCH(n) == 1) {
1910 n = CHILD(n, 0);
1911 goto loop;
1912 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001914 case power:
1915 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001917 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 return NULL;
1919 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001920 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001921 return NULL;
1922}
1923
1924static expr_ty
1925ast_for_call(struct compiling *c, const node *n, expr_ty func)
1926{
1927 /*
1928 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1929 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 */
1932
1933 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001934 asdl_seq *args;
1935 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 expr_ty vararg = NULL, kwarg = NULL;
1937
1938 REQ(n, arglist);
1939
1940 nargs = 0;
1941 nkeywords = 0;
1942 ngens = 0;
1943 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 node *ch = CHILD(n, i);
1945 if (TYPE(ch) == argument) {
1946 if (NCH(ch) == 1)
1947 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001948 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001951 nkeywords++;
1952 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 }
1954 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001955 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 "if not sole argument");
1957 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 }
1959
1960 if (nargs + nkeywords + ngens > 255) {
1961 ast_error(n, "more than 255 arguments");
1962 return NULL;
1963 }
1964
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001967 return NULL;
1968 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 nargs = 0;
1972 nkeywords = 0;
1973 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 node *ch = CHILD(n, i);
1975 if (TYPE(ch) == argument) {
1976 expr_ty e;
1977 if (NCH(ch) == 1) {
1978 if (nkeywords) {
1979 ast_error(CHILD(ch, 0),
1980 "non-keyword arg after keyword arg");
1981 return NULL;
1982 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001983 if (vararg) {
1984 ast_error(CHILD(ch, 0),
1985 "only named arguments may follow *expression");
1986 return NULL;
1987 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 asdl_seq_SET(args, nargs++, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001993 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001995 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001996 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 else {
2000 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002001 identifier key, tmp;
2002 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002007 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002008 /* f(lambda x: x[0] = 3) ends up getting parsed with
2009 * LHS test = lambda x: x[0], and RHS test = 3.
2010 * SF bug 132313 points out that complaining about a keyword
2011 * then is very confusing.
2012 */
2013 if (e->kind == Lambda_kind) {
2014 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 } else if (e->kind != Name_kind) {
2017 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002018 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002019 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 return NULL;
2021 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002022 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002023 for (k = 0; k < nkeywords; k++) {
2024 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2025 if (!PyUnicode_Compare(tmp, key)) {
2026 ast_error(CHILD(ch, 0), "keyword argument repeated");
2027 return NULL;
2028 }
2029 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002032 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002035 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002036 asdl_seq_SET(keywords, nkeywords++, kw);
2037 }
2038 }
2039 else if (TYPE(ch) == STAR) {
2040 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002041 if (!vararg)
2042 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043 i++;
2044 }
2045 else if (TYPE(ch) == DOUBLESTAR) {
2046 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002047 if (!kwarg)
2048 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002049 i++;
2050 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 }
2052
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002053 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054}
2055
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002059 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 /* testlist: test (',' test)* [','] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002062 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002063 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002064 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002065 }
2066 else {
2067 assert(TYPE(n) == testlist ||
Benjamin Peterson4905e802009-09-27 02:43:28 +00002068 TYPE(n) == testlist_star_expr);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002069 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 else {
2073 asdl_seq *tmp = seq_for_testlist(c, n);
2074 if (!tmp)
2075 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002076 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002078}
2079
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080static stmt_ty
2081ast_for_expr_stmt(struct compiling *c, const node *n)
2082{
2083 REQ(n, expr_stmt);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 | ('=' (yield_expr|testlist))*)
Benjamin Peterson4905e802009-09-27 02:43:28 +00002086 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 test: ... here starts the operator precendence dance
2090 */
2091
2092 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002093 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 if (!e)
2095 return NULL;
2096
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 }
2099 else if (TYPE(CHILD(n, 1)) == augassign) {
2100 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002102 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103
Thomas Wouters89f507f2006-12-13 04:49:30 +00002104 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002105 if (!expr1)
2106 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002107 if(!set_context(c, expr1, Store, ch))
2108 return NULL;
Benjamin Petersonbd27aef2009-10-03 20:27:13 +00002109 /* set_context checks that most expressions are not the left side.
2110 Augmented assignments can only have a name, a subscript, or an
2111 attribute on the left, though, so we have to explicitly check for
2112 those. */
2113 switch (expr1->kind) {
2114 case Name_kind:
2115 case Attribute_kind:
2116 case Subscript_kind:
2117 break;
2118 default:
2119 ast_error(ch, "illegal expression for augmented assignment");
2120 return NULL;
2121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Thomas Wouters89f507f2006-12-13 04:49:30 +00002123 ch = CHILD(n, 2);
2124 if (TYPE(ch) == testlist)
2125 expr2 = ast_for_testlist(c, ch);
2126 else
2127 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002128 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 return NULL;
2130
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002131 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002132 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 return NULL;
2134
Thomas Wouters89f507f2006-12-13 04:49:30 +00002135 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 }
2137 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002138 int i;
2139 asdl_seq *targets;
2140 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141 expr_ty expression;
2142
Thomas Wouters89f507f2006-12-13 04:49:30 +00002143 /* a normal assignment */
2144 REQ(CHILD(n, 1), EQUAL);
2145 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2146 if (!targets)
2147 return NULL;
2148 for (i = 0; i < NCH(n) - 2; i += 2) {
2149 expr_ty e;
2150 node *ch = CHILD(n, i);
2151 if (TYPE(ch) == yield_expr) {
2152 ast_error(ch, "assignment to yield expression not possible");
2153 return NULL;
2154 }
2155 e = ast_for_testlist(c, ch);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002157 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002159 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002160 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 asdl_seq_SET(targets, i / 2, e);
2164 }
2165 value = CHILD(n, NCH(n) - 1);
Benjamin Peterson4905e802009-09-27 02:43:28 +00002166 if (TYPE(value) == testlist_star_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002167 expression = ast_for_testlist(c, value);
2168 else
2169 expression = ast_for_expr(c, value);
2170 if (!expression)
2171 return NULL;
2172 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174}
2175
Benjamin Peterson78565b22009-06-28 19:19:51 +00002176
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002178ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179{
2180 asdl_seq *seq;
2181 int i;
2182 expr_ty e;
2183
2184 REQ(n, exprlist);
2185
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002186 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002190 e = ast_for_expr(c, CHILD(n, i));
2191 if (!e)
2192 return NULL;
2193 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002194 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 }
2197 return seq;
2198}
2199
2200static stmt_ty
2201ast_for_del_stmt(struct compiling *c, const node *n)
2202{
2203 asdl_seq *expr_list;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205 /* del_stmt: 'del' exprlist */
2206 REQ(n, del_stmt);
2207
2208 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2209 if (!expr_list)
2210 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002211 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212}
2213
2214static stmt_ty
2215ast_for_flow_stmt(struct compiling *c, const node *n)
2216{
2217 /*
2218 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2219 | yield_stmt
2220 break_stmt: 'break'
2221 continue_stmt: 'continue'
2222 return_stmt: 'return' [testlist]
2223 yield_stmt: yield_expr
2224 yield_expr: 'yield' testlist
2225 raise_stmt: 'raise' [test [',' test [',' test]]]
2226 */
2227 node *ch;
2228
2229 REQ(n, flow_stmt);
2230 ch = CHILD(n, 0);
2231 switch (TYPE(ch)) {
2232 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002235 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002237 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2238 if (!exp)
2239 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002240 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 }
2242 case return_stmt:
2243 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002244 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002246 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247 if (!expression)
2248 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002249 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 }
2251 case raise_stmt:
2252 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002253 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2254 else if (NCH(ch) >= 2) {
2255 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2257 if (!expression)
2258 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002259 if (NCH(ch) == 4) {
2260 cause = ast_for_expr(c, CHILD(ch, 3));
2261 if (!cause)
2262 return NULL;
2263 }
2264 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 }
2266 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002267 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 "unexpected flow_stmt: %d", TYPE(ch));
2269 return NULL;
2270 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002271
2272 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274}
2275
2276static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002277alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278{
2279 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002280 import_as_name: NAME ['as' NAME]
2281 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 dotted_name: NAME ('.' NAME)*
2283 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002284 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 loop:
2287 switch (TYPE(n)) {
Benjamin Petersonf63d6152011-06-20 21:40:19 -05002288 case import_as_name: {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002289 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002290 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002291 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002292 if (!name)
2293 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002294 if (NCH(n) == 3) {
2295 node *str_node = CHILD(n, 2);
2296 str = NEW_IDENTIFIER(str_node);
2297 if (!str)
2298 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002299 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002300 return NULL;
2301 }
2302 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002303 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002304 return NULL;
2305 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002306 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002307 }
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 {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002314 node *asname_node = CHILD(n, 2);
2315 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002316 if (!a)
2317 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002319 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002320 if (!a->asname)
2321 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002322 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002323 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 return a;
2325 }
2326 break;
2327 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002328 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002329 node *name_node = CHILD(n, 0);
2330 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002331 if (!name)
2332 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002333 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002334 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002335 return alias(name, NULL, c->c_arena);
2336 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 else {
2338 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002339 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002340 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 char *s;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343
2344 len = 0;
2345 for (i = 0; i < NCH(n); i += 2)
2346 /* length of string plus one for the dot */
2347 len += strlen(STR(CHILD(n, i))) + 1;
2348 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002349 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (!str)
2351 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002352 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 if (!s)
2354 return NULL;
2355 for (i = 0; i < NCH(n); i += 2) {
2356 char *sch = STR(CHILD(n, i));
2357 strcpy(s, STR(CHILD(n, i)));
2358 s += strlen(sch);
2359 *s++ = '.';
2360 }
2361 --s;
2362 *s = '\0';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2364 PyBytes_GET_SIZE(str),
2365 NULL);
2366 Py_DECREF(str);
2367 if (!uni)
2368 return NULL;
2369 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002370 PyUnicode_InternInPlace(&str);
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 }
2374 break;
2375 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002376 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002380 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 "unexpected import name: %d", TYPE(n));
2382 return NULL;
2383 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002384
2385 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 return NULL;
2387}
2388
2389static stmt_ty
2390ast_for_import_stmt(struct compiling *c, const node *n)
2391{
2392 /*
2393 import_stmt: import_name | import_from
2394 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002395 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2396 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002398 int lineno;
2399 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 int i;
2401 asdl_seq *aliases;
2402
2403 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002404 lineno = LINENO(n);
2405 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002407 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 REQ(n, dotted_as_names);
2410 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2411 if (!aliases)
2412 return NULL;
2413 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002414 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002415 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002421 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 int idx, ndots = 0;
2424 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002425 identifier modname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002427 /* Count the number of dots (for relative imports) and check for the
2428 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002429 for (idx = 1; idx < NCH(n); idx++) {
2430 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002431 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2432 if (!mod)
2433 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 idx++;
2435 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002436 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002438 ndots += 3;
2439 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 } else if (TYPE(CHILD(n, idx)) != DOT) {
2441 break;
2442 }
2443 ndots++;
2444 }
2445 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002446 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002447 case STAR:
2448 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 n = CHILD(n, idx);
2450 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002451 break;
2452 case LPAR:
2453 /* from ... import (x, y, z) */
2454 n = CHILD(n, idx + 1);
2455 n_children = NCH(n);
2456 break;
2457 case import_as_names:
2458 /* from ... import x, y, z */
2459 n = CHILD(n, idx);
2460 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002461 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 ast_error(n, "trailing comma not allowed without"
2463 " surrounding parentheses");
2464 return NULL;
2465 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 break;
2467 default:
2468 ast_error(n, "Unexpected node-type in from-import");
2469 return NULL;
2470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2473 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475
2476 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002477 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002478 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002479 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002483 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002485 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002486 if (!import_alias)
2487 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002491 if (mod != NULL)
2492 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002493 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002494 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Neal Norwitz79792652005-11-14 04:25:03 +00002496 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 "unknown import statement: starts with command '%s'",
2498 STR(CHILD(n, 0)));
2499 return NULL;
2500}
2501
2502static stmt_ty
2503ast_for_global_stmt(struct compiling *c, const node *n)
2504{
2505 /* global_stmt: 'global' NAME (',' NAME)* */
2506 identifier name;
2507 asdl_seq *s;
2508 int i;
2509
2510 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 name = NEW_IDENTIFIER(CHILD(n, i));
2516 if (!name)
2517 return NULL;
2518 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002520 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521}
2522
2523static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002524ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2525{
2526 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2527 identifier name;
2528 asdl_seq *s;
2529 int i;
2530
2531 REQ(n, nonlocal_stmt);
2532 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2533 if (!s)
2534 return NULL;
2535 for (i = 1; i < NCH(n); i += 2) {
2536 name = NEW_IDENTIFIER(CHILD(n, i));
2537 if (!name)
2538 return NULL;
2539 asdl_seq_SET(s, i / 2, name);
2540 }
2541 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2542}
2543
2544static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545ast_for_assert_stmt(struct compiling *c, const node *n)
2546{
2547 /* assert_stmt: 'assert' test [',' test] */
2548 REQ(n, assert_stmt);
2549 if (NCH(n) == 2) {
2550 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2551 if (!expression)
2552 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002553 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
2555 else if (NCH(n) == 4) {
2556 expr_ty expr1, expr2;
2557
2558 expr1 = ast_for_expr(c, CHILD(n, 1));
2559 if (!expr1)
2560 return NULL;
2561 expr2 = ast_for_expr(c, CHILD(n, 3));
2562 if (!expr2)
2563 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 }
Neal Norwitz79792652005-11-14 04:25:03 +00002567 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 "improper number of parts to 'assert' statement: %d",
2569 NCH(n));
2570 return NULL;
2571}
2572
2573static asdl_seq *
2574ast_for_suite(struct compiling *c, const node *n)
2575{
2576 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002577 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 stmt_ty s;
2579 int i, total, num, end, pos = 0;
2580 node *ch;
2581
2582 REQ(n, suite);
2583
2584 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002585 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 n = CHILD(n, 0);
2590 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002592 */
2593 end = NCH(n) - 1;
2594 if (TYPE(CHILD(n, end - 1)) == SEMI)
2595 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 for (i = 0; i < end; i += 2) {
2598 ch = CHILD(n, i);
2599 s = ast_for_stmt(c, ch);
2600 if (!s)
2601 return NULL;
2602 asdl_seq_SET(seq, pos++, s);
2603 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 }
2605 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 for (i = 2; i < (NCH(n) - 1); i++) {
2607 ch = CHILD(n, i);
2608 REQ(ch, stmt);
2609 num = num_stmts(ch);
2610 if (num == 1) {
2611 /* small_stmt or compound_stmt with only one child */
2612 s = ast_for_stmt(c, ch);
2613 if (!s)
2614 return NULL;
2615 asdl_seq_SET(seq, pos++, s);
2616 }
2617 else {
2618 int j;
2619 ch = CHILD(ch, 0);
2620 REQ(ch, simple_stmt);
2621 for (j = 0; j < NCH(ch); j += 2) {
2622 /* statement terminates with a semi-colon ';' */
2623 if (NCH(CHILD(ch, j)) == 0) {
2624 assert((j + 1) == NCH(ch));
2625 break;
2626 }
2627 s = ast_for_stmt(c, CHILD(ch, j));
2628 if (!s)
2629 return NULL;
2630 asdl_seq_SET(seq, pos++, s);
2631 }
2632 }
2633 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 }
2635 assert(pos == seq->size);
2636 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637}
2638
2639static stmt_ty
2640ast_for_if_stmt(struct compiling *c, const node *n)
2641{
2642 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2643 ['else' ':' suite]
2644 */
2645 char *s;
2646
2647 REQ(n, if_stmt);
2648
2649 if (NCH(n) == 4) {
2650 expr_ty expression;
2651 asdl_seq *suite_seq;
2652
2653 expression = ast_for_expr(c, CHILD(n, 1));
2654 if (!expression)
2655 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002656 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002657 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659
Guido van Rossumd8faa362007-04-27 19:54:29 +00002660 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2661 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 s = STR(CHILD(n, 4));
2665 /* s[2], the third character in the string, will be
2666 's' for el_s_e, or
2667 'i' for el_i_f
2668 */
2669 if (s[2] == 's') {
2670 expr_ty expression;
2671 asdl_seq *seq1, *seq2;
2672
2673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
2679 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 return NULL;
2682
Guido van Rossumd8faa362007-04-27 19:54:29 +00002683 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2684 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 }
2686 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002688 expr_ty expression;
2689 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 asdl_seq *orelse = NULL;
2691 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 /* must reference the child n_elif+1 since 'else' token is third,
2693 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002694 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2695 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2696 has_else = 1;
2697 n_elif -= 3;
2698 }
2699 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Thomas Wouters89f507f2006-12-13 04:49:30 +00002701 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703
Thomas Wouters89f507f2006-12-13 04:49:30 +00002704 orelse = asdl_seq_new(1, c->c_arena);
2705 if (!orelse)
2706 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002708 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002710 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2711 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002713 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2714 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 asdl_seq_SET(orelse, 0,
2718 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002719 LINENO(CHILD(n, NCH(n) - 6)),
2720 CHILD(n, NCH(n) - 6)->n_col_offset,
2721 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 /* the just-created orelse handled the last elif */
2723 n_elif--;
2724 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 for (i = 0; i < n_elif; i++) {
2727 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002728 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2729 if (!newobj)
2730 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002735 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737
Thomas Wouters89f507f2006-12-13 04:49:30 +00002738 asdl_seq_SET(newobj, 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002740 LINENO(CHILD(n, off)),
2741 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002742 orelse = newobj;
2743 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002744 expression = ast_for_expr(c, CHILD(n, 1));
2745 if (!expression)
2746 return NULL;
2747 suite_seq = ast_for_suite(c, CHILD(n, 3));
2748 if (!suite_seq)
2749 return NULL;
2750 return If(expression, suite_seq, orelse,
2751 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753
2754 PyErr_Format(PyExc_SystemError,
2755 "unexpected token in 'if' statement: %s", s);
2756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757}
2758
2759static stmt_ty
2760ast_for_while_stmt(struct compiling *c, const node *n)
2761{
2762 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2763 REQ(n, while_stmt);
2764
2765 if (NCH(n) == 4) {
2766 expr_ty expression;
2767 asdl_seq *suite_seq;
2768
2769 expression = ast_for_expr(c, CHILD(n, 1));
2770 if (!expression)
2771 return NULL;
2772 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002775 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 }
2777 else if (NCH(n) == 7) {
2778 expr_ty expression;
2779 asdl_seq *seq1, *seq2;
2780
2781 expression = ast_for_expr(c, CHILD(n, 1));
2782 if (!expression)
2783 return NULL;
2784 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002788 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 return NULL;
2790
Thomas Wouters89f507f2006-12-13 04:49:30 +00002791 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793
2794 PyErr_Format(PyExc_SystemError,
2795 "wrong number of tokens for 'while' statement: %d",
2796 NCH(n));
2797 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798}
2799
2800static stmt_ty
2801ast_for_for_stmt(struct compiling *c, const node *n)
2802{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002803 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002805 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002806 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2808 REQ(n, for_stmt);
2809
2810 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002811 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 if (!seq)
2813 return NULL;
2814 }
2815
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002816 node_target = CHILD(n, 1);
2817 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002818 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002820 /* Check the # of children rather than the length of _target, since
2821 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002822 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002823 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002824 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002826 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002828 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002829 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
2831 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002832 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return NULL;
2834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002835 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2836 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837}
2838
2839static excepthandler_ty
2840ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2841{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002842 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 REQ(exc, except_clause);
2844 REQ(body, suite);
2845
2846 if (NCH(exc) == 1) {
2847 asdl_seq *suite_seq = ast_for_suite(c, body);
2848 if (!suite_seq)
2849 return NULL;
2850
Neal Norwitzad74aa82008-03-31 05:14:30 +00002851 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002852 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 }
2854 else if (NCH(exc) == 2) {
2855 expr_ty expression;
2856 asdl_seq *suite_seq;
2857
2858 expression = ast_for_expr(c, CHILD(exc, 1));
2859 if (!expression)
2860 return NULL;
2861 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002862 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 return NULL;
2864
Neal Norwitzad74aa82008-03-31 05:14:30 +00002865 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002866 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 }
2868 else if (NCH(exc) == 4) {
2869 asdl_seq *suite_seq;
2870 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002871 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002872 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002874 if (forbidden_name(e, CHILD(exc, 3), 0))
2875 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002877 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002878 return NULL;
2879 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002880 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 return NULL;
2882
Neal Norwitzad74aa82008-03-31 05:14:30 +00002883 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002884 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002886
2887 PyErr_Format(PyExc_SystemError,
2888 "wrong number of children for 'except' clause: %d",
2889 NCH(exc));
2890 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891}
2892
2893static stmt_ty
2894ast_for_try_stmt(struct compiling *c, const node *n)
2895{
Neal Norwitzf599f422005-12-17 21:33:47 +00002896 const int nch = NCH(n);
2897 int n_except = (nch - 3)/3;
2898 asdl_seq *body, *orelse = NULL, *finally = NULL;
2899
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900 REQ(n, try_stmt);
2901
Neal Norwitzf599f422005-12-17 21:33:47 +00002902 body = ast_for_suite(c, CHILD(n, 2));
2903 if (body == NULL)
2904 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
Neal Norwitzf599f422005-12-17 21:33:47 +00002906 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2907 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2908 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2909 /* we can assume it's an "else",
2910 because nch >= 9 for try-else-finally and
2911 it would otherwise have a type of except_clause */
2912 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2913 if (orelse == NULL)
2914 return NULL;
2915 n_except--;
2916 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917
Neal Norwitzf599f422005-12-17 21:33:47 +00002918 finally = ast_for_suite(c, CHILD(n, nch - 1));
2919 if (finally == NULL)
2920 return NULL;
2921 n_except--;
2922 }
2923 else {
2924 /* we can assume it's an "else",
2925 otherwise it would have a type of except_clause */
2926 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2927 if (orelse == NULL)
2928 return NULL;
2929 n_except--;
2930 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002931 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002932 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002933 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934 return NULL;
2935 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936
Neal Norwitzf599f422005-12-17 21:33:47 +00002937 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002938 int i;
2939 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002940 /* process except statements to create a try ... except */
2941 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2942 if (handlers == NULL)
2943 return NULL;
2944
2945 for (i = 0; i < n_except; i++) {
2946 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2947 CHILD(n, 5 + i * 3));
2948 if (!e)
2949 return NULL;
2950 asdl_seq_SET(handlers, i, e);
2951 }
2952
Thomas Wouters89f507f2006-12-13 04:49:30 +00002953 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002954 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002955 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002956 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002957
2958 /* if a 'finally' is present too, we nest the TryExcept within a
2959 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 body = asdl_seq_new(1, c->c_arena);
2961 if (body == NULL)
2962 return NULL;
2963 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002964 }
2965
2966 /* must be a try ... finally (except clauses are in body, if any exist) */
2967 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002968 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969}
2970
Georg Brandl0c315622009-05-25 21:10:36 +00002971/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002972static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002973ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974{
2975 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002976
Georg Brandl0c315622009-05-25 21:10:36 +00002977 REQ(n, with_item);
2978 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arc92dc80a2010-08-19 17:43:15 +00002979 if (!context_expr)
2980 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002981 if (NCH(n) == 3) {
2982 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002983
2984 if (!optional_vars) {
2985 return NULL;
2986 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002987 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002988 return NULL;
2989 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002990 }
2991
Georg Brandl0c315622009-05-25 21:10:36 +00002992 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002993 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002994}
2995
Georg Brandl0c315622009-05-25 21:10:36 +00002996/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2997static stmt_ty
2998ast_for_with_stmt(struct compiling *c, const node *n)
2999{
3000 int i;
3001 stmt_ty ret;
3002 asdl_seq *inner;
3003
3004 REQ(n, with_stmt);
3005
3006 /* process the with items inside-out */
3007 i = NCH(n) - 1;
3008 /* the suite of the innermost with item is the suite of the with stmt */
3009 inner = ast_for_suite(c, CHILD(n, i));
3010 if (!inner)
3011 return NULL;
3012
3013 for (;;) {
3014 i -= 2;
3015 ret = ast_for_with_item(c, CHILD(n, i), inner);
3016 if (!ret)
3017 return NULL;
3018 /* was this the last item? */
3019 if (i == 1)
3020 break;
3021 /* if not, wrap the result so far in a new sequence */
3022 inner = asdl_seq_new(1, c->c_arena);
3023 if (!inner)
3024 return NULL;
3025 asdl_seq_SET(inner, 0, ret);
3026 }
3027
3028 return ret;
3029}
3030
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003032ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003034 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003035 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003036 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003037 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003038
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 REQ(n, classdef);
3040
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003041 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003042 s = ast_for_suite(c, CHILD(n, 3));
3043 if (!s)
3044 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003045 classname = NEW_IDENTIFIER(CHILD(n, 1));
3046 if (!classname)
3047 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003048 if (forbidden_name(classname, CHILD(n, 3), 0))
3049 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003050 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 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003053
3054 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003055 s = ast_for_suite(c, CHILD(n,5));
3056 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003057 return NULL;
3058 classname = NEW_IDENTIFIER(CHILD(n, 1));
3059 if (!classname)
3060 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003061 if (forbidden_name(classname, CHILD(n, 3), 0))
3062 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003063 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3064 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 }
3066
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003067 /* class NAME '(' arglist ')' ':' suite */
3068 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003069 {
3070 PyObject *dummy_name;
3071 expr_ty dummy;
3072 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3073 if (!dummy_name)
3074 return NULL;
3075 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3076 call = ast_for_call(c, CHILD(n, 3), dummy);
3077 if (!call)
3078 return NULL;
3079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003081 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003083 classname = NEW_IDENTIFIER(CHILD(n, 1));
3084 if (!classname)
3085 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003086 if (forbidden_name(classname, CHILD(n, 1), 0))
3087 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003088
Benjamin Peterson30760062008-11-25 04:02:28 +00003089 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003090 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003091 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092}
3093
3094static stmt_ty
3095ast_for_stmt(struct compiling *c, const node *n)
3096{
3097 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003098 assert(NCH(n) == 1);
3099 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 }
3101 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003102 assert(num_stmts(n) == 1);
3103 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 }
3105 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003106 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003107 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3108 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 */
3110 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 case expr_stmt:
3112 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 case del_stmt:
3114 return ast_for_del_stmt(c, n);
3115 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003116 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 case flow_stmt:
3118 return ast_for_flow_stmt(c, n);
3119 case import_stmt:
3120 return ast_for_import_stmt(c, n);
3121 case global_stmt:
3122 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003123 case nonlocal_stmt:
3124 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 case assert_stmt:
3126 return ast_for_assert_stmt(c, n);
3127 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003128 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3130 TYPE(n), NCH(n));
3131 return NULL;
3132 }
3133 }
3134 else {
3135 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003136 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003137 */
3138 node *ch = CHILD(n, 0);
3139 REQ(n, compound_stmt);
3140 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 case if_stmt:
3142 return ast_for_if_stmt(c, ch);
3143 case while_stmt:
3144 return ast_for_while_stmt(c, ch);
3145 case for_stmt:
3146 return ast_for_for_stmt(c, ch);
3147 case try_stmt:
3148 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003149 case with_stmt:
3150 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003152 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003154 return ast_for_classdef(c, ch, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 case decorated:
3156 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003158 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3160 TYPE(n), NCH(n));
3161 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003162 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163 }
3164}
3165
3166static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003167parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 const char *end;
3170 long x;
3171 double dx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003172 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003174
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003175 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003176 errno = 0;
3177 end = s + strlen(s) - 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 imflag = *end == 'j' || *end == 'J';
Guido van Rossumd8faa362007-04-27 19:54:29 +00003179 if (s[0] == '0') {
3180 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3181 if (x < 0 && errno == 0) {
3182 return PyLong_FromString((char *)s,
3183 (char **)0,
3184 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003185 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 }
3187 else
3188 x = PyOS_strtol((char *)s, (char **)&end, 0);
3189 if (*end == '\0') {
3190 if (errno != 0)
3191 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003192 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 }
3194 /* XXX Huge floats may silently fail */
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003196 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003197 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3198 if (compl.imag == -1.0 && PyErr_Occurred())
3199 return NULL;
3200 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 }
3202 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003204 dx = PyOS_string_to_double(s, NULL, NULL);
3205 if (dx == -1.0 && PyErr_Occurred())
3206 return NULL;
3207 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209}
3210
3211static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003212decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 PyObject *u, *v;
3215 char *s, *t;
3216 t = s = (char *)*sPtr;
3217 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3218 while (s < end && (*s & 0x80)) s++;
3219 *sPtr = s;
3220 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3221 if (u == NULL)
3222 return NULL;
3223 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3224 Py_DECREF(u);
3225 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226}
3227
3228static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003229decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003231 PyObject *v, *u;
3232 char *buf;
3233 char *p;
3234 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003235
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 if (encoding == NULL) {
3237 buf = (char *)s;
3238 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003240 /* check for integer overflow */
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003241 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003242 return NULL;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003243 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3244 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3245 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 if (u == NULL)
3247 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003248 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003249 end = s + len;
3250 while (s < end) {
3251 if (*s == '\\') {
3252 *p++ = *s++;
3253 if (*s & 0x80) {
3254 strcpy(p, "u005c");
3255 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003256 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 }
3258 if (*s & 0x80) { /* XXX inefficient */
3259 PyObject *w;
3260 char *r;
3261 Py_ssize_t rn, i;
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003262 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 if (w == NULL) {
3264 Py_DECREF(u);
3265 return NULL;
3266 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003267 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003268 rn = Py_SIZE(w);
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003269 assert(rn % 4 == 0);
3270 for (i = 0; i < rn; i += 4) {
3271 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003272 r[i + 0] & 0xFF,
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003273 r[i + 1] & 0xFF,
3274 r[i + 2] & 0xFF,
3275 r[i + 3] & 0xFF);
3276 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003277 }
Benjamin Petersonb2e796a2009-10-28 21:59:39 +00003278 /* Should be impossible to overflow */
3279 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003280 Py_DECREF(w);
3281 } else {
3282 *p++ = *s++;
3283 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003284 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003285 len = p - buf;
3286 s = buf;
3287 }
3288 if (rawmode)
3289 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3290 else
3291 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3292 Py_XDECREF(u);
3293 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294}
3295
3296/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003297 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 * parsestr parses it, and returns the decoded Python string object.
3299 */
3300static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003301parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003302{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003303 size_t len;
3304 const char *s = STR(n);
3305 int quote = Py_CHARMASK(*s);
3306 int rawmode = 0;
3307 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003308 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003309 if (quote == 'b' || quote == 'B') {
3310 quote = *++s;
3311 *bytesmode = 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 if (quote == 'r' || quote == 'R') {
3314 quote = *++s;
3315 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003316 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 }
3318 if (quote != '\'' && quote != '\"') {
3319 PyErr_BadInternalCall();
3320 return NULL;
3321 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003322 s++;
3323 len = strlen(s);
3324 if (len > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 "string to parse is too long");
3327 return NULL;
3328 }
3329 if (s[--len] != quote) {
3330 PyErr_BadInternalCall();
3331 return NULL;
3332 }
3333 if (len >= 4 && s[0] == quote && s[1] == quote) {
3334 s += 2;
3335 len -= 2;
3336 if (s[--len] != quote || s[--len] != quote) {
3337 PyErr_BadInternalCall();
3338 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003339 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003340 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003341 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003342 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003343 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003344 if (*bytesmode) {
3345 /* Disallow non-ascii characters (but not escapes) */
3346 const char *c;
3347 for (c = s; *c; c++) {
3348 if (Py_CHARMASK(*c) >= 0x80) {
3349 ast_error(n, "bytes can only contain ASCII "
3350 "literal characters.");
3351 return NULL;
3352 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003353 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003354 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003355 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003356 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003357 if (rawmode || strchr(s, '\\') == NULL) {
3358 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003359 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003360 if (u == NULL || !*bytesmode)
3361 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003362 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003363 Py_DECREF(u);
3364 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003365 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003366 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003367 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003368 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003370 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003371 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003372 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003373 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003374 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375}
3376
Guido van Rossum29fd7122007-11-12 01:13:56 +00003377/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378 * compile-time literal catenation, calling parsestr() on each piece, and
3379 * pasting the intermediate results together.
3380 */
3381static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003382parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003384 PyObject *v;
3385 int i;
3386 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003387 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003388 if (v != NULL) {
3389 /* String literal concatenation */
3390 for (i = 1; i < NCH(n); i++) {
3391 PyObject *s;
3392 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003393 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003394 if (s == NULL)
3395 goto onError;
3396 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003397 ast_error(n, "cannot mix bytes and nonbytes literals");
Christian Heimes3d463392012-09-10 16:52:42 +02003398 Py_DECREF(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003399 goto onError;
3400 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003401 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3402 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003403 if (v == NULL)
3404 goto onError;
3405 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003406 else {
3407 PyObject *temp = PyUnicode_Concat(v, s);
3408 Py_DECREF(s);
3409 Py_DECREF(v);
3410 v = temp;
3411 if (v == NULL)
3412 goto onError;
3413 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003414 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003415 }
3416 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417
Guido van Rossumd8faa362007-04-27 19:54:29 +00003418 onError:
3419 Py_XDECREF(v);
3420 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421}