blob: fb3894449a013c94720f6a97ca0e09a850049c4e [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
61 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000062 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000063 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
74 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000229 /* PEP 3120 */
230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
360 NULL,
361};
362
363static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000364forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000366 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000367 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
368 ast_error(n, "assignment to keyword");
369 return 1;
370 }
371 if (full_checks) {
372 const char **p;
373 for (p = FORBIDDEN; *p; p++) {
374 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
375 ast_error(n, "assignment to keyword");
376 return 1;
377 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000378 }
379 }
380 return 0;
381}
382
Jeremy Hyltona8293132006-02-28 17:58:27 +0000383/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384
385 Only sets context for expr kinds that "can appear in assignment context"
386 (according to ../Parser/Python.asdl). For other expr kinds, it sets
387 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000388*/
389
390static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000391set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392{
393 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 /* If a particular expression type can't be used for assign / delete,
395 set expr_name to its name and an error message will be generated.
396 */
397 const char* expr_name = NULL;
398
399 /* The ast defines augmented store and load contexts, but the
400 implementation here doesn't actually use them. The code may be
401 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000402 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000404 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000405 */
406 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407
408 switch (e->kind) {
409 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000411 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
412 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Subscript.ctx = ctx;
416 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000417 case Starred_kind:
418 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000419 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 return 0;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000423 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000424 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000425 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 }
427 e->v.Name.ctx = ctx;
428 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 e->v.List.ctx = ctx;
431 s = e->v.List.elts;
432 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000434 if (asdl_seq_LEN(e->v.Tuple.elts)) {
435 e->v.Tuple.ctx = ctx;
436 s = e->v.Tuple.elts;
437 }
438 else {
439 expr_name = "()";
440 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 expr_name = "literal";
473 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000474 case Ellipsis_kind:
475 expr_name = "Ellipsis";
476 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000477 case Compare_kind:
478 expr_name = "comparison";
479 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 case IfExp_kind:
481 expr_name = "conditional expression";
482 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000483 default:
484 PyErr_Format(PyExc_SystemError,
485 "unexpected expression in assignment %d (line %d)",
486 e->kind, e->lineno);
487 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000489 /* Check for error string set by switch */
490 if (expr_name) {
491 char buf[300];
492 PyOS_snprintf(buf, sizeof(buf),
493 "can't %s %s",
494 ctx == Store ? "assign to" : "delete",
495 expr_name);
496 return ast_error(n, buf);
497 }
498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000500 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 */
502 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000503 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000506 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 return 0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 return 1;
511}
512
513static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515{
516 REQ(n, augassign);
517 n = CHILD(n, 0);
518 switch (STR(n)[0]) {
519 case '+':
520 return Add;
521 case '-':
522 return Sub;
523 case '/':
524 if (STR(n)[1] == '/')
525 return FloorDiv;
526 else
527 return Div;
528 case '%':
529 return Mod;
530 case '<':
531 return LShift;
532 case '>':
533 return RShift;
534 case '&':
535 return BitAnd;
536 case '^':
537 return BitXor;
538 case '|':
539 return BitOr;
540 case '*':
541 if (STR(n)[1] == '*')
542 return Pow;
543 else
544 return Mult;
545 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000546 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 }
549}
550
551static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000552ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000554 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 |'is' 'not'
556 */
557 REQ(n, comp_op);
558 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 n = CHILD(n, 0);
560 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 case LESS:
562 return Lt;
563 case GREATER:
564 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 return Eq;
567 case LESSEQUAL:
568 return LtE;
569 case GREATEREQUAL:
570 return GtE;
571 case NOTEQUAL:
572 return NotEq;
573 case NAME:
574 if (strcmp(STR(n), "in") == 0)
575 return In;
576 if (strcmp(STR(n), "is") == 0)
577 return Is;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
584 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 /* handle "not in" and "is not" */
586 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 case NAME:
588 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
589 return NotIn;
590 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
591 return IsNot;
592 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000593 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 }
Neal Norwitz79792652005-11-14 04:25:03 +0000598 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601}
602
603static asdl_seq *
604seq_for_testlist(struct compiling *c, const node *n)
605{
606 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000607 asdl_seq *seq;
608 expr_ty expression;
609 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000610 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000612 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613 if (!seq)
614 return NULL;
615
616 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000617 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
619 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000620 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622
623 assert(i / 2 < seq->size);
624 asdl_seq_SET(seq, i / 2, expression);
625 }
626 return seq;
627}
628
Neal Norwitzc1505362006-12-28 06:47:50 +0000629static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000630compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000631{
632 identifier name;
633 expr_ty annotation = NULL;
634 node *ch;
635
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000636 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000637 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000638 name = NEW_IDENTIFIER(ch);
639 if (!name)
640 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000641 if (forbidden_name(name, ch, 0))
642 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000643
644 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
645 annotation = ast_for_expr(c, CHILD(n, 2));
646 if (!annotation)
647 return NULL;
648 }
649
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000650 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000651#if 0
652 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
653 if (!set_context(c, result, Store, n))
654 return NULL;
655 return result;
656#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657}
658
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659/* returns -1 if failed to handle keyword only arguments
660 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000661 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000662 ^^^
663 start pointing here
664 */
665static int
666handle_keywordonly_args(struct compiling *c, const node *n, int start,
667 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
668{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000669 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 expr_ty expression, annotation;
672 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 int i = start;
674 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000675
676 if (kwonlyargs == NULL) {
677 ast_error(CHILD(n, start), "named arguments must follow bare *");
678 return -1;
679 }
680 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 while (i < NCH(n)) {
682 ch = CHILD(n, i);
683 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000684 case vfpdef:
685 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000686 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000687 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000688 asdl_seq_SET(kwdefaults, j, expression);
689 i += 2; /* '=' and test */
690 }
691 else { /* setting NULL if no default value exists */
692 asdl_seq_SET(kwdefaults, j, NULL);
693 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 if (NCH(ch) == 3) {
695 /* ch is NAME ':' test */
696 annotation = ast_for_expr(c, CHILD(ch, 2));
697 if (!annotation) {
698 ast_error(ch, "expected expression");
699 goto error;
700 }
701 }
702 else {
703 annotation = NULL;
704 }
705 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000706 argname = NEW_IDENTIFIER(ch);
707 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000709 if (forbidden_name(argname, ch, 0))
710 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000711 arg = arg(argname, annotation, c->c_arena);
712 if (!arg)
713 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000715 i += 2; /* the name and the comma */
716 break;
717 case DOUBLESTAR:
718 return i;
719 default:
720 ast_error(ch, "unexpected node");
721 goto error;
722 }
723 }
724 return i;
725 error:
726 return -1;
727}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728
Jeremy Hyltona8293132006-02-28 17:58:27 +0000729/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730
731static arguments_ty
732ast_for_arguments(struct compiling *c, const node *n)
733{
Neal Norwitzc1505362006-12-28 06:47:50 +0000734 /* This function handles both typedargslist (function definition)
735 and varargslist (lambda definition).
736
737 parameters: '(' [typedargslist] ')'
738 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000739 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
740 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000742 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000743 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000744 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
745 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000747 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749 int i, j, k, nposargs = 0, nkwonlyargs = 0;
750 int nposdefaults = 0, found_default = 0;
751 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000753 arg_ty arg;
754 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 node *ch;
756
757 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000758 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
760 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000763 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764
Jeremy Hyltone921e022008-07-17 16:37:17 +0000765 /* First count the number of positional args & defaults. The
766 variable i is the loop index for this for loop and the next.
767 The next loop picks up where the first leaves off.
768 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770 ch = CHILD(n, i);
771 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000772 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000773 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000774 if (i < NCH(n) && /* skip argument following star */
775 (TYPE(CHILD(n, i)) == tfpdef ||
776 TYPE(CHILD(n, i)) == vfpdef)) {
777 i++;
778 }
779 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000780 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000781 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000782 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 /* count the number of keyword only args &
786 defaults for keyword only args */
787 for ( ; i < NCH(n); ++i) {
788 ch = CHILD(n, i);
789 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000790 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
793 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000794 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 kwonlyargs = (nkwonlyargs ?
796 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
797 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 posdefaults = (nposdefaults ?
800 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
801 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000802 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 /* The length of kwonlyargs and kwdefaults are same
804 since we set NULL as default for keyword only argument w/o default
805 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000806 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
808 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810
811 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 ast_error(n, "more than 255 arguments");
813 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000816 /* tfpdef: NAME [':' test]
817 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818 */
819 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000820 j = 0; /* index for defaults */
821 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 ch = CHILD(n, i);
824 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 case tfpdef:
826 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
828 anything other than EQUAL or a comma? */
829 /* XXX Should NCH(n) check be made a separate check? */
830 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000831 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
832 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 goto error;
834 assert(posdefaults != NULL);
835 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 else if (found_default) {
840 ast_error(n,
841 "non-default argument follows default argument");
842 goto error;
843 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000844 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 if (!arg)
846 goto error;
847 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 i += 2; /* the name and the comma */
849 break;
850 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000852 ast_error(CHILD(n, i),
853 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000855 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000856 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000857 if (TYPE(ch) == COMMA) {
858 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 i += 2; /* now follows keyword only arguments */
860 res = handle_keywordonly_args(c, n, i,
861 kwonlyargs, kwdefaults);
862 if (res == -1) goto error;
863 i = res; /* res has new position to process */
864 }
865 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000866 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000867 if (!vararg)
868 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000869 if (forbidden_name(vararg, CHILD(ch, 0), 0))
870 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000871 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000872 /* there is an annotation on the vararg */
873 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000875 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000876 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
877 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000878 int res = 0;
879 res = handle_keywordonly_args(c, n, i,
880 kwonlyargs, kwdefaults);
881 if (res == -1) goto error;
882 i = res; /* res has new position to process */
883 }
884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 break;
886 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000887 ch = CHILD(n, i+1); /* tfpdef */
888 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
890 if (NCH(ch) > 1) {
891 /* there is an annotation on the kwarg */
892 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
893 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000894 if (!kwarg)
895 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000896 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
897 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 i += 3;
899 break;
900 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000901 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 "unexpected node in varargslist: %d @ %d",
903 TYPE(ch), i);
904 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000905 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000907 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
908 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000910 Py_XDECREF(vararg);
911 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 return NULL;
913}
914
915static expr_ty
916ast_for_dotted_name(struct compiling *c, const node *n)
917{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000918 expr_ty e;
919 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000920 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 int i;
922
923 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000924
925 lineno = LINENO(n);
926 col_offset = n->n_col_offset;
927
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 id = NEW_IDENTIFIER(CHILD(n, 0));
929 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000930 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000931 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000933 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934
935 for (i = 2; i < NCH(n); i+=2) {
936 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000937 if (!id)
938 return NULL;
939 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
940 if (!e)
941 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 }
943
944 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945}
946
947static expr_ty
948ast_for_decorator(struct compiling *c, const node *n)
949{
950 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
951 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000952 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953
954 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000955 REQ(CHILD(n, 0), AT);
956 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957
958 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
959 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000960 return NULL;
961
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000963 d = name_expr;
964 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 }
966 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000967 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000968 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (!d)
970 return NULL;
971 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 }
973 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000974 d = ast_for_call(c, CHILD(n, 3), name_expr);
975 if (!d)
976 return NULL;
977 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 }
979
980 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981}
982
983static asdl_seq*
984ast_for_decorators(struct compiling *c, const node *n)
985{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000986 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000987 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 int i;
989
990 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000991 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 if (!decorator_seq)
993 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000996 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 if (!d)
998 return NULL;
999 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 }
1001 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002}
1003
1004static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001005ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001007 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001008 identifier name;
1009 arguments_ty args;
1010 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001011 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001012 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
1014 REQ(n, funcdef);
1015
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016 name = NEW_IDENTIFIER(CHILD(n, name_i));
1017 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001019 if (forbidden_name(name, CHILD(n, name_i), 0))
1020 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1022 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001023 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001024 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1025 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1026 if (!returns)
1027 return NULL;
1028 name_i += 2;
1029 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 body = ast_for_suite(c, CHILD(n, name_i + 3));
1031 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033
Neal Norwitzc1505362006-12-28 06:47:50 +00001034 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036}
1037
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001038static stmt_ty
1039ast_for_decorated(struct compiling *c, const node *n)
1040{
1041 /* decorated: decorators (classdef | funcdef) */
1042 stmt_ty thing = NULL;
1043 asdl_seq *decorator_seq = NULL;
1044
1045 REQ(n, decorated);
1046
1047 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1048 if (!decorator_seq)
1049 return NULL;
1050
1051 assert(TYPE(CHILD(n, 1)) == funcdef ||
1052 TYPE(CHILD(n, 1)) == classdef);
1053
1054 if (TYPE(CHILD(n, 1)) == funcdef) {
1055 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1056 } else if (TYPE(CHILD(n, 1)) == classdef) {
1057 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1058 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001059 /* we count the decorators in when talking about the class' or
1060 * function's line number */
1061 if (thing) {
1062 thing->lineno = LINENO(n);
1063 thing->col_offset = n->n_col_offset;
1064 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001065 return thing;
1066}
1067
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068static expr_ty
1069ast_for_lambdef(struct compiling *c, const node *n)
1070{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001071 /* lambdef: 'lambda' [varargslist] ':' test
1072 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073 arguments_ty args;
1074 expr_ty expression;
1075
1076 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001077 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1078 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 if (!args)
1080 return NULL;
1081 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001082 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 }
1085 else {
1086 args = ast_for_arguments(c, CHILD(n, 1));
1087 if (!args)
1088 return NULL;
1089 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001090 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 }
1093
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001094 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001097static expr_ty
1098ast_for_ifexpr(struct compiling *c, const node *n)
1099{
1100 /* test: or_test 'if' or_test 'else' test */
1101 expr_ty expression, body, orelse;
1102
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001103 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001104 body = ast_for_expr(c, CHILD(n, 0));
1105 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001106 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001107 expression = ast_for_expr(c, CHILD(n, 2));
1108 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001110 orelse = ast_for_expr(c, CHILD(n, 4));
1111 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001112 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1114 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001115}
1116
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001118 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119
Nick Coghlan650f0d02007-04-15 12:05:43 +00001120 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121*/
1122
1123static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001124count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128 count_comp_for:
1129 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001130 REQ(n, comp_for);
1131 if (NCH(n) == 5)
1132 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 else
1134 return n_fors;
1135 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001136 REQ(n, comp_iter);
1137 n = CHILD(n, 0);
1138 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001139 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001140 else if (TYPE(n) == comp_if) {
1141 if (NCH(n) == 3) {
1142 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001144 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 else
1146 return n_fors;
1147 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001148
Guido van Rossumd8faa362007-04-27 19:54:29 +00001149 /* Should never be reached */
1150 PyErr_SetString(PyExc_SystemError,
1151 "logic error in count_comp_fors");
1152 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Nick Coghlan650f0d02007-04-15 12:05:43 +00001155/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
Nick Coghlan650f0d02007-04-15 12:05:43 +00001157 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158*/
1159
1160static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001161count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164
Guido van Rossumd8faa362007-04-27 19:54:29 +00001165 while (1) {
1166 REQ(n, comp_iter);
1167 if (TYPE(CHILD(n, 0)) == comp_for)
1168 return n_ifs;
1169 n = CHILD(n, 0);
1170 REQ(n, comp_if);
1171 n_ifs++;
1172 if (NCH(n) == 2)
1173 return n_ifs;
1174 n = CHILD(n, 2);
1175 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176}
1177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178static asdl_seq *
1179ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001182 asdl_seq *comps;
1183
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001184 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 if (n_fors == -1)
1186 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187
Nick Coghlan650f0d02007-04-15 12:05:43 +00001188 comps = asdl_seq_new(n_fors, c->c_arena);
1189 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001193 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 asdl_seq *t;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001195 expr_ty expression, first;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001196 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199
Guido van Rossum992d4a32007-07-11 13:09:30 +00001200 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001201 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001204 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207
Thomas Wouters89f507f2006-12-13 04:49:30 +00001208 /* Check the # of children rather than the length of t, since
1209 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001210 first = (expr_ty)asdl_seq_GET(t, 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001211 if (NCH(for_ch) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001212 comp = comprehension(first, expression, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00001214 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1215 c->c_arena),
1216 expression, NULL, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001217 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219
Guido van Rossum992d4a32007-07-11 13:09:30 +00001220 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221 int j, n_ifs;
1222 asdl_seq *ifs;
1223
Guido van Rossum992d4a32007-07-11 13:09:30 +00001224 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001225 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001226 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001228
1229 ifs = asdl_seq_new(n_ifs, c->c_arena);
1230 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001232
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001234 REQ(n, comp_iter);
1235 n = CHILD(n, 0);
1236 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237
Guido van Rossum992d4a32007-07-11 13:09:30 +00001238 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001239 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001240 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001241 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001242 if (NCH(n) == 3)
1243 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001245 /* on exit, must guarantee that n is a comp_for */
1246 if (TYPE(n) == comp_iter)
1247 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001248 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001250 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001251 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001252 return comps;
1253}
1254
1255static expr_ty
1256ast_for_itercomp(struct compiling *c, const node *n, int type)
1257{
1258 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1259 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1260 expr_ty elt;
1261 asdl_seq *comps;
1262
1263 assert(NCH(n) > 1);
1264
1265 elt = ast_for_expr(c, CHILD(n, 0));
1266 if (!elt)
1267 return NULL;
1268
1269 comps = ast_for_comprehension(c, CHILD(n, 1));
1270 if (!comps)
1271 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001272
1273 if (type == COMP_GENEXP)
1274 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1275 else if (type == COMP_LISTCOMP)
1276 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1277 else if (type == COMP_SETCOMP)
1278 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1279 else
1280 /* Should never happen */
1281 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001282}
1283
1284static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001285ast_for_dictcomp(struct compiling *c, const node *n)
1286{
1287 expr_ty key, value;
1288 asdl_seq *comps;
1289
1290 assert(NCH(n) > 3);
1291 REQ(CHILD(n, 1), COLON);
1292
1293 key = ast_for_expr(c, CHILD(n, 0));
1294 if (!key)
1295 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001296 value = ast_for_expr(c, CHILD(n, 2));
1297 if (!value)
1298 return NULL;
1299
1300 comps = ast_for_comprehension(c, CHILD(n, 3));
1301 if (!comps)
1302 return NULL;
1303
1304 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1305}
1306
1307static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001308ast_for_genexp(struct compiling *c, const node *n)
1309{
1310 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001311 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001312}
1313
1314static expr_ty
1315ast_for_listcomp(struct compiling *c, const node *n)
1316{
1317 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001318 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001319}
1320
1321static expr_ty
1322ast_for_setcomp(struct compiling *c, const node *n)
1323{
1324 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001325 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001326}
1327
1328
1329static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330ast_for_atom(struct compiling *c, const node *n)
1331{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001332 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1333 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001334 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 */
1336 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001337 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338
1339 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001340 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 /* All names start in Load context, but may later be
1342 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001343 PyObject *name = NEW_IDENTIFIER(ch);
1344 if (!name)
1345 return NULL;
1346 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1347 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001349 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001350 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001351 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 PyObject *type, *value, *tback, *errstr;
1353 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001354 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001355 if (errstr) {
1356 char *s = "";
1357 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001358 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001359 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1360 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001361 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001362 } else {
1363 ast_error(n, "(unicode error) unknown error");
1364 }
1365 Py_DECREF(type);
1366 Py_DECREF(value);
1367 Py_XDECREF(tback);
1368 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001369 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001370 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001372 if (bytesmode)
1373 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1374 else
1375 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 }
1377 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001378 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001379 if (!pynum)
1380 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001381
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 PyArena_AddPyObject(c->c_arena, pynum);
1383 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384 }
Georg Brandldde00282007-03-18 19:01:53 +00001385 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001386 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001388 ch = CHILD(n, 1);
1389
1390 if (TYPE(ch) == RPAR)
1391 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1392
1393 if (TYPE(ch) == yield_expr)
1394 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001395
1396 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1397 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001398 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001399
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001402 ch = CHILD(n, 1);
1403
1404 if (TYPE(ch) == RSQB)
1405 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1406
Nick Coghlan650f0d02007-04-15 12:05:43 +00001407 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1409 asdl_seq *elts = seq_for_testlist(c, ch);
1410 if (!elts)
1411 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001412
Thomas Wouters89f507f2006-12-13 04:49:30 +00001413 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1414 }
1415 else
1416 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001417 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001418 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1419 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001420 int i, size;
1421 asdl_seq *keys, *values;
1422
1423 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001424 if (TYPE(ch) == RBRACE) {
1425 /* it's an empty dict */
1426 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1427 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1428 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001429 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001430 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001431 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001432 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001433 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001434 for (i = 0; i < NCH(ch); i += 2) {
1435 expr_ty expression;
1436 expression = ast_for_expr(c, CHILD(ch, i));
1437 if (!expression)
1438 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001439 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001440 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001441 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1442 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1443 /* it's a set comprehension */
1444 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001445 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1446 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 } else {
1448 /* it's a dict */
1449 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1450 keys = asdl_seq_new(size, c->c_arena);
1451 if (!keys)
1452 return NULL;
1453
1454 values = asdl_seq_new(size, c->c_arena);
1455 if (!values)
1456 return NULL;
1457
1458 for (i = 0; i < NCH(ch); i += 4) {
1459 expr_ty expression;
1460
1461 expression = ast_for_expr(c, CHILD(ch, i));
1462 if (!expression)
1463 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001464
Guido van Rossum86e58e22006-08-28 15:27:34 +00001465 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001466
Guido van Rossum86e58e22006-08-28 15:27:34 +00001467 expression = ast_for_expr(c, CHILD(ch, i + 2));
1468 if (!expression)
1469 return NULL;
1470
1471 asdl_seq_SET(values, i / 4, expression);
1472 }
1473 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1474 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001477 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1478 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 }
1480}
1481
1482static slice_ty
1483ast_for_slice(struct compiling *c, const node *n)
1484{
1485 node *ch;
1486 expr_ty lower = NULL, upper = NULL, step = NULL;
1487
1488 REQ(n, subscript);
1489
1490 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001491 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 sliceop: ':' [test]
1493 */
1494 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 if (NCH(n) == 1 && TYPE(ch) == test) {
1496 /* 'step' variable hold no significance in terms of being used over
1497 other vars */
1498 step = ast_for_expr(c, ch);
1499 if (!step)
1500 return NULL;
1501
Thomas Wouters89f507f2006-12-13 04:49:30 +00001502 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 }
1504
1505 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001506 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 if (!lower)
1508 return NULL;
1509 }
1510
1511 /* If there's an upper bound it's in the second or third position. */
1512 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001513 if (NCH(n) > 1) {
1514 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515
Thomas Wouters89f507f2006-12-13 04:49:30 +00001516 if (TYPE(n2) == test) {
1517 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 if (!upper)
1519 return NULL;
1520 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001521 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001523 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 if (TYPE(n2) == test) {
1526 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527 if (!upper)
1528 return NULL;
1529 }
1530 }
1531
1532 ch = CHILD(n, NCH(n) - 1);
1533 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001534 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001535 ch = CHILD(ch, 1);
1536 if (TYPE(ch) == test) {
1537 step = ast_for_expr(c, ch);
1538 if (!step)
1539 return NULL;
1540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 }
1542 }
1543
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001544 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545}
1546
1547static expr_ty
1548ast_for_binop(struct compiling *c, const node *n)
1549{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550 /* Must account for a sequence of expressions.
1551 How should A op B op C by represented?
1552 BinOp(BinOp(A, op, B), op, C).
1553 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001554
Guido van Rossumd8faa362007-04-27 19:54:29 +00001555 int i, nops;
1556 expr_ty expr1, expr2, result;
1557 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558
Guido van Rossumd8faa362007-04-27 19:54:29 +00001559 expr1 = ast_for_expr(c, CHILD(n, 0));
1560 if (!expr1)
1561 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562
Guido van Rossumd8faa362007-04-27 19:54:29 +00001563 expr2 = ast_for_expr(c, CHILD(n, 2));
1564 if (!expr2)
1565 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 newoperator = get_operator(CHILD(n, 1));
1568 if (!newoperator)
1569 return NULL;
1570
1571 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1572 c->c_arena);
1573 if (!result)
1574 return NULL;
1575
1576 nops = (NCH(n) - 1) / 2;
1577 for (i = 1; i < nops; i++) {
1578 expr_ty tmp_result, tmp;
1579 const node* next_oper = CHILD(n, i * 2 + 1);
1580
1581 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001582 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 return NULL;
1584
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1586 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587 return NULL;
1588
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589 tmp_result = BinOp(result, newoperator, tmp,
1590 LINENO(next_oper), next_oper->n_col_offset,
1591 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001592 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001593 return NULL;
1594 result = tmp_result;
1595 }
1596 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001597}
1598
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001599static expr_ty
1600ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1601{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001602 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1603 subscriptlist: subscript (',' subscript)* [',']
1604 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1605 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001606 REQ(n, trailer);
1607 if (TYPE(CHILD(n, 0)) == LPAR) {
1608 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001609 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1610 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001612 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001613 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001614 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001615 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1616 if (!attr_id)
1617 return NULL;
1618 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001619 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001620 }
1621 else {
1622 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 REQ(CHILD(n, 2), RSQB);
1624 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001625 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1627 if (!slc)
1628 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001629 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1630 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 }
1632 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001633 /* The grammar is ambiguous here. The ambiguity is resolved
1634 by treating the sequence as a tuple literal if there are
1635 no slice features.
1636 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 int j;
1638 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001639 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001640 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001641 asdl_seq *slices, *elts;
1642 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001643 if (!slices)
1644 return NULL;
1645 for (j = 0; j < NCH(n); j += 2) {
1646 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001647 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001648 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001649 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001650 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001651 asdl_seq_SET(slices, j / 2, slc);
1652 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001653 if (!simple) {
1654 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 }
1657 /* extract Index values and put them in a Tuple */
1658 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001659 if (!elts)
1660 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001661 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1662 slc = (slice_ty)asdl_seq_GET(slices, j);
1663 assert(slc->kind == Index_kind && slc->v.Index.value);
1664 asdl_seq_SET(elts, j, slc->v.Index.value);
1665 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001666 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001667 if (!e)
1668 return NULL;
1669 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001670 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001671 }
1672 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001673}
1674
1675static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001676ast_for_factor(struct compiling *c, const node *n)
1677{
1678 node *pfactor, *ppower, *patom, *pnum;
1679 expr_ty expression;
1680
1681 /* If the unary - operator is applied to a constant, don't generate
1682 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1683 constant. The peephole optimizer already does something like
1684 this but it doesn't handle the case where the constant is
1685 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1686 PyLongObject.
1687 */
1688 if (TYPE(CHILD(n, 0)) == MINUS
1689 && NCH(n) == 2
1690 && TYPE((pfactor = CHILD(n, 1))) == factor
1691 && NCH(pfactor) == 1
1692 && TYPE((ppower = CHILD(pfactor, 0))) == power
1693 && NCH(ppower) == 1
1694 && TYPE((patom = CHILD(ppower, 0))) == atom
1695 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1696 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1697 if (s == NULL)
1698 return NULL;
1699 s[0] = '-';
1700 strcpy(s + 1, STR(pnum));
1701 PyObject_FREE(STR(pnum));
1702 STR(pnum) = s;
1703 return ast_for_atom(c, patom);
1704 }
1705
1706 expression = ast_for_expr(c, CHILD(n, 1));
1707 if (!expression)
1708 return NULL;
1709
1710 switch (TYPE(CHILD(n, 0))) {
1711 case PLUS:
1712 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1713 c->c_arena);
1714 case MINUS:
1715 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1716 c->c_arena);
1717 case TILDE:
1718 return UnaryOp(Invert, expression, LINENO(n),
1719 n->n_col_offset, c->c_arena);
1720 }
1721 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1722 TYPE(CHILD(n, 0)));
1723 return NULL;
1724}
1725
1726static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001727ast_for_power(struct compiling *c, const node *n)
1728{
1729 /* power: atom trailer* ('**' factor)*
1730 */
1731 int i;
1732 expr_ty e, tmp;
1733 REQ(n, power);
1734 e = ast_for_atom(c, CHILD(n, 0));
1735 if (!e)
1736 return NULL;
1737 if (NCH(n) == 1)
1738 return e;
1739 for (i = 1; i < NCH(n); i++) {
1740 node *ch = CHILD(n, i);
1741 if (TYPE(ch) != trailer)
1742 break;
1743 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001745 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001746 tmp->lineno = e->lineno;
1747 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001748 e = tmp;
1749 }
1750 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1751 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001752 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001753 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001754 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001755 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001756 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001757 e = tmp;
1758 }
1759 return e;
1760}
1761
Guido van Rossum0368b722007-05-11 16:50:42 +00001762static expr_ty
1763ast_for_starred(struct compiling *c, const node *n)
1764{
1765 expr_ty tmp;
1766 REQ(n, star_expr);
1767
1768 tmp = ast_for_expr(c, CHILD(n, 1));
1769 if (!tmp)
1770 return NULL;
1771
1772 /* The Load context is changed later. */
1773 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1774}
1775
1776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001777/* Do not name a variable 'expr'! Will cause a compile error.
1778*/
1779
1780static expr_ty
1781ast_for_expr(struct compiling *c, const node *n)
1782{
1783 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001784 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001785 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001786 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 and_test: not_test ('and' not_test)*
1788 not_test: 'not' not_test | comparison
1789 comparison: expr (comp_op expr)*
1790 expr: xor_expr ('|' xor_expr)*
1791 xor_expr: and_expr ('^' and_expr)*
1792 and_expr: shift_expr ('&' shift_expr)*
1793 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1794 arith_expr: term (('+'|'-') term)*
1795 term: factor (('*'|'/'|'%'|'//') factor)*
1796 factor: ('+'|'-'|'~') factor | power
1797 power: atom trailer* ('**' factor)*
1798 */
1799
1800 asdl_seq *seq;
1801 int i;
1802
1803 loop:
1804 switch (TYPE(n)) {
1805 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001806 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001807 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001810 else if (NCH(n) > 1)
1811 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001812 /* Fallthrough */
1813 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 case and_test:
1815 if (NCH(n) == 1) {
1816 n = CHILD(n, 0);
1817 goto loop;
1818 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001819 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 if (!seq)
1821 return NULL;
1822 for (i = 0; i < NCH(n); i += 2) {
1823 expr_ty e = ast_for_expr(c, CHILD(n, i));
1824 if (!e)
1825 return NULL;
1826 asdl_seq_SET(seq, i / 2, e);
1827 }
1828 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1830 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001831 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001832 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 case not_test:
1834 if (NCH(n) == 1) {
1835 n = CHILD(n, 0);
1836 goto loop;
1837 }
1838 else {
1839 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1840 if (!expression)
1841 return NULL;
1842
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1844 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 }
1846 case comparison:
1847 if (NCH(n) == 1) {
1848 n = CHILD(n, 0);
1849 goto loop;
1850 }
1851 else {
1852 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001853 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 if (!ops)
1857 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001858 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 return NULL;
1861 }
1862 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001863 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001865 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869
1870 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001871 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001873 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001875 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 asdl_seq_SET(cmps, i / 2, expression);
1877 }
1878 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001879 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001883 return Compare(expression, ops, cmps, LINENO(n),
1884 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 }
1886 break;
1887
Guido van Rossum0368b722007-05-11 16:50:42 +00001888 case star_expr:
1889 if (TYPE(CHILD(n, 0)) == STAR) {
1890 return ast_for_starred(c, n);
1891 }
1892 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 /* The next five cases all handle BinOps. The main body of code
1894 is the same in each case, but the switch turned inside out to
1895 reuse the code for each type of operator.
1896 */
1897 case expr:
1898 case xor_expr:
1899 case and_expr:
1900 case shift_expr:
1901 case arith_expr:
1902 case term:
1903 if (NCH(n) == 1) {
1904 n = CHILD(n, 0);
1905 goto loop;
1906 }
1907 return ast_for_binop(c, n);
1908 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 expr_ty exp = NULL;
1910 if (NCH(n) == 2) {
1911 exp = ast_for_testlist(c, CHILD(n, 1));
1912 if (!exp)
1913 return NULL;
1914 }
1915 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1916 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001917 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 if (NCH(n) == 1) {
1919 n = CHILD(n, 0);
1920 goto loop;
1921 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001922 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001923 case power:
1924 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001926 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 return NULL;
1928 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001929 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 return NULL;
1931}
1932
1933static expr_ty
1934ast_for_call(struct compiling *c, const node *n, expr_ty func)
1935{
1936 /*
1937 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1938 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001939 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 */
1941
1942 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001943 asdl_seq *args;
1944 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 expr_ty vararg = NULL, kwarg = NULL;
1946
1947 REQ(n, arglist);
1948
1949 nargs = 0;
1950 nkeywords = 0;
1951 ngens = 0;
1952 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001953 node *ch = CHILD(n, i);
1954 if (TYPE(ch) == argument) {
1955 if (NCH(ch) == 1)
1956 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 nkeywords++;
1961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 }
1963 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001964 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001965 "if not sole argument");
1966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 }
1968
1969 if (nargs + nkeywords + ngens > 255) {
1970 ast_error(n, "more than 255 arguments");
1971 return NULL;
1972 }
1973
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001974 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001976 return NULL;
1977 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 nargs = 0;
1981 nkeywords = 0;
1982 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 node *ch = CHILD(n, i);
1984 if (TYPE(ch) == argument) {
1985 expr_ty e;
1986 if (NCH(ch) == 1) {
1987 if (nkeywords) {
1988 ast_error(CHILD(ch, 0),
1989 "non-keyword arg after keyword arg");
1990 return NULL;
1991 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001992 if (vararg) {
1993 ast_error(CHILD(ch, 0),
1994 "only named arguments may follow *expression");
1995 return NULL;
1996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001999 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 asdl_seq_SET(args, nargs++, e);
2001 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002002 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 else {
2009 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002010 identifier key, tmp;
2011 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 /* CHILD(ch, 0) is test, but must be an identifier? */
2014 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 /* f(lambda x: x[0] = 3) ends up getting parsed with
2018 * LHS test = lambda x: x[0], and RHS test = 3.
2019 * SF bug 132313 points out that complaining about a keyword
2020 * then is very confusing.
2021 */
2022 if (e->kind == Lambda_kind) {
2023 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002024 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 } else if (e->kind != Name_kind) {
2026 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002027 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002028 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002029 return NULL;
2030 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002032 for (k = 0; k < nkeywords; k++) {
2033 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2034 if (!PyUnicode_Compare(tmp, key)) {
2035 ast_error(CHILD(ch, 0), "keyword argument repeated");
2036 return NULL;
2037 }
2038 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002041 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 asdl_seq_SET(keywords, nkeywords++, kw);
2046 }
2047 }
2048 else if (TYPE(ch) == STAR) {
2049 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002050 if (!vararg)
2051 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002052 i++;
2053 }
2054 else if (TYPE(ch) == DOUBLESTAR) {
2055 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002056 if (!kwarg)
2057 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002058 i++;
2059 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
2061
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002062 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063}
2064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002066ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002068 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002069 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002070 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002072 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002073 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002074 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002075 }
2076 else {
2077 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002078 TYPE(n) == testlist1);
2079 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 else {
2083 asdl_seq *tmp = seq_for_testlist(c, n);
2084 if (!tmp)
2085 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002088}
2089
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090static stmt_ty
2091ast_for_expr_stmt(struct compiling *c, const node *n)
2092{
2093 REQ(n, expr_stmt);
2094 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2095 | ('=' (yield_expr|testlist))*)
2096 testlist: test (',' test)* [',']
2097 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002098 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 test: ... here starts the operator precendence dance
2100 */
2101
2102 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (!e)
2105 return NULL;
2106
Thomas Wouters89f507f2006-12-13 04:49:30 +00002107 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002108 }
2109 else if (TYPE(CHILD(n, 1)) == augassign) {
2110 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002111 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002112 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113
Thomas Wouters89f507f2006-12-13 04:49:30 +00002114 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 if (!expr1)
2116 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002117 if(!set_context(c, expr1, Store, ch))
2118 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002119
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 ch = CHILD(n, 2);
2121 if (TYPE(ch) == testlist)
2122 expr2 = ast_for_testlist(c, ch);
2123 else
2124 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002125 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 return NULL;
2127
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002128 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 return NULL;
2131
Thomas Wouters89f507f2006-12-13 04:49:30 +00002132 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 }
2134 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002135 int i;
2136 asdl_seq *targets;
2137 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 expr_ty expression;
2139
Thomas Wouters89f507f2006-12-13 04:49:30 +00002140 /* a normal assignment */
2141 REQ(CHILD(n, 1), EQUAL);
2142 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2143 if (!targets)
2144 return NULL;
2145 for (i = 0; i < NCH(n) - 2; i += 2) {
2146 expr_ty e;
2147 node *ch = CHILD(n, i);
2148 if (TYPE(ch) == yield_expr) {
2149 ast_error(ch, "assignment to yield expression not possible");
2150 return NULL;
2151 }
2152 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 /* set context to assign */
2155 if (!e)
2156 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002158 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002159 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 asdl_seq_SET(targets, i / 2, e);
2162 }
2163 value = CHILD(n, NCH(n) - 1);
2164 if (TYPE(value) == testlist)
2165 expression = ast_for_testlist(c, value);
2166 else
2167 expression = ast_for_expr(c, value);
2168 if (!expression)
2169 return NULL;
2170 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172}
2173
Benjamin Peterson78565b22009-06-28 19:19:51 +00002174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002175static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002176ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177{
2178 asdl_seq *seq;
2179 int i;
2180 expr_ty e;
2181
2182 REQ(n, exprlist);
2183
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002184 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002186 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 e = ast_for_expr(c, CHILD(n, i));
2189 if (!e)
2190 return NULL;
2191 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002192 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002193 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 }
2195 return seq;
2196}
2197
2198static stmt_ty
2199ast_for_del_stmt(struct compiling *c, const node *n)
2200{
2201 asdl_seq *expr_list;
2202
2203 /* del_stmt: 'del' exprlist */
2204 REQ(n, del_stmt);
2205
2206 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2207 if (!expr_list)
2208 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002209 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210}
2211
2212static stmt_ty
2213ast_for_flow_stmt(struct compiling *c, const node *n)
2214{
2215 /*
2216 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2217 | yield_stmt
2218 break_stmt: 'break'
2219 continue_stmt: 'continue'
2220 return_stmt: 'return' [testlist]
2221 yield_stmt: yield_expr
2222 yield_expr: 'yield' testlist
2223 raise_stmt: 'raise' [test [',' test [',' test]]]
2224 */
2225 node *ch;
2226
2227 REQ(n, flow_stmt);
2228 ch = CHILD(n, 0);
2229 switch (TYPE(ch)) {
2230 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002231 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002235 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2236 if (!exp)
2237 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 }
2240 case return_stmt:
2241 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002244 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 if (!expression)
2246 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002247 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 case raise_stmt:
2250 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002251 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2252 else if (NCH(ch) >= 2) {
2253 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2255 if (!expression)
2256 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002257 if (NCH(ch) == 4) {
2258 cause = ast_for_expr(c, CHILD(ch, 3));
2259 if (!cause)
2260 return NULL;
2261 }
2262 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 }
2264 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002265 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002266 "unexpected flow_stmt: %d", TYPE(ch));
2267 return NULL;
2268 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002269
2270 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2271 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272}
2273
2274static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002275alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276{
2277 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002278 import_as_name: NAME ['as' NAME]
2279 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 dotted_name: NAME ('.' NAME)*
2281 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002282 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002283
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 loop:
2285 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002286 case import_as_name: {
2287 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002288 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002289 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002290 if (!name)
2291 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002292 if (NCH(n) == 3) {
2293 node *str_node = CHILD(n, 2);
2294 str = NEW_IDENTIFIER(str_node);
2295 if (!str)
2296 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002297 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002298 return NULL;
2299 }
2300 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002301 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002302 return NULL;
2303 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002304 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002305 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 case dotted_as_name:
2307 if (NCH(n) == 1) {
2308 n = CHILD(n, 0);
2309 goto loop;
2310 }
2311 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002312 node *asname_node = CHILD(n, 2);
2313 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002314 if (!a)
2315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002317 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002318 if (!a->asname)
2319 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002320 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002321 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322 return a;
2323 }
2324 break;
2325 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002326 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002327 node *name_node = CHILD(n, 0);
2328 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002329 if (!name)
2330 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002331 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002332 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002333 return alias(name, NULL, c->c_arena);
2334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335 else {
2336 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002337 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002338 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002339 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002340 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341
2342 len = 0;
2343 for (i = 0; i < NCH(n); i += 2)
2344 /* length of string plus one for the dot */
2345 len += strlen(STR(CHILD(n, i))) + 1;
2346 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002347 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 if (!str)
2349 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002350 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002351 if (!s)
2352 return NULL;
2353 for (i = 0; i < NCH(n); i += 2) {
2354 char *sch = STR(CHILD(n, i));
2355 strcpy(s, STR(CHILD(n, i)));
2356 s += strlen(sch);
2357 *s++ = '.';
2358 }
2359 --s;
2360 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002361 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2362 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002363 NULL);
2364 Py_DECREF(str);
2365 if (!uni)
2366 return NULL;
2367 str = uni;
2368 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002370 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 }
2372 break;
2373 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002374 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002375 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002376 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002378 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 "unexpected import name: %d", TYPE(n));
2380 return NULL;
2381 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002382
2383 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 return NULL;
2385}
2386
2387static stmt_ty
2388ast_for_import_stmt(struct compiling *c, const node *n)
2389{
2390 /*
2391 import_stmt: import_name | import_from
2392 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002393 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2394 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002396 int lineno;
2397 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 int i;
2399 asdl_seq *aliases;
2400
2401 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002402 lineno = LINENO(n);
2403 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002405 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 REQ(n, dotted_as_names);
2408 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2409 if (!aliases)
2410 return NULL;
2411 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002412 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002413 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002419 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 int idx, ndots = 0;
2422 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002423 identifier modname = NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002424
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002425 /* Count the number of dots (for relative imports) and check for the
2426 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002427 for (idx = 1; idx < NCH(n); idx++) {
2428 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002429 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2430 if (!mod)
2431 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 idx++;
2433 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002434 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2435 /* three consecutive dots are tokenized as one ELLIPSIS */
2436 ndots += 3;
2437 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 } else if (TYPE(CHILD(n, idx)) != DOT) {
2439 break;
2440 }
2441 ndots++;
2442 }
2443 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002444 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002445 case STAR:
2446 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 n = CHILD(n, idx);
2448 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 break;
2450 case LPAR:
2451 /* from ... import (x, y, z) */
2452 n = CHILD(n, idx + 1);
2453 n_children = NCH(n);
2454 break;
2455 case import_as_names:
2456 /* from ... import x, y, z */
2457 n = CHILD(n, idx);
2458 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002459 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460 ast_error(n, "trailing comma not allowed without"
2461 " surrounding parentheses");
2462 return NULL;
2463 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 break;
2465 default:
2466 ast_error(n, "Unexpected node-type in from-import");
2467 return NULL;
2468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2471 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473
2474 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002475 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002476 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002477 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002481 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002483 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002484 if (!import_alias)
2485 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002486 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002487 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002489 if (mod != NULL)
2490 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002491 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002492 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493 }
Neal Norwitz79792652005-11-14 04:25:03 +00002494 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 "unknown import statement: starts with command '%s'",
2496 STR(CHILD(n, 0)));
2497 return NULL;
2498}
2499
2500static stmt_ty
2501ast_for_global_stmt(struct compiling *c, const node *n)
2502{
2503 /* global_stmt: 'global' NAME (',' NAME)* */
2504 identifier name;
2505 asdl_seq *s;
2506 int i;
2507
2508 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002509 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002511 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 name = NEW_IDENTIFIER(CHILD(n, i));
2514 if (!name)
2515 return NULL;
2516 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002518 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519}
2520
2521static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002522ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2523{
2524 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2525 identifier name;
2526 asdl_seq *s;
2527 int i;
2528
2529 REQ(n, nonlocal_stmt);
2530 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2531 if (!s)
2532 return NULL;
2533 for (i = 1; i < NCH(n); i += 2) {
2534 name = NEW_IDENTIFIER(CHILD(n, i));
2535 if (!name)
2536 return NULL;
2537 asdl_seq_SET(s, i / 2, name);
2538 }
2539 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2540}
2541
2542static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543ast_for_assert_stmt(struct compiling *c, const node *n)
2544{
2545 /* assert_stmt: 'assert' test [',' test] */
2546 REQ(n, assert_stmt);
2547 if (NCH(n) == 2) {
2548 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2549 if (!expression)
2550 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002551 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 }
2553 else if (NCH(n) == 4) {
2554 expr_ty expr1, expr2;
2555
2556 expr1 = ast_for_expr(c, CHILD(n, 1));
2557 if (!expr1)
2558 return NULL;
2559 expr2 = ast_for_expr(c, CHILD(n, 3));
2560 if (!expr2)
2561 return NULL;
2562
Thomas Wouters89f507f2006-12-13 04:49:30 +00002563 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 }
Neal Norwitz79792652005-11-14 04:25:03 +00002565 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 "improper number of parts to 'assert' statement: %d",
2567 NCH(n));
2568 return NULL;
2569}
2570
2571static asdl_seq *
2572ast_for_suite(struct compiling *c, const node *n)
2573{
2574 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002575 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576 stmt_ty s;
2577 int i, total, num, end, pos = 0;
2578 node *ch;
2579
2580 REQ(n, suite);
2581
2582 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002583 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002584 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 n = CHILD(n, 0);
2588 /* simple_stmt always ends with a NEWLINE,
2589 and may have a trailing SEMI
2590 */
2591 end = NCH(n) - 1;
2592 if (TYPE(CHILD(n, end - 1)) == SEMI)
2593 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002595 for (i = 0; i < end; i += 2) {
2596 ch = CHILD(n, i);
2597 s = ast_for_stmt(c, ch);
2598 if (!s)
2599 return NULL;
2600 asdl_seq_SET(seq, pos++, s);
2601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
2603 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002604 for (i = 2; i < (NCH(n) - 1); i++) {
2605 ch = CHILD(n, i);
2606 REQ(ch, stmt);
2607 num = num_stmts(ch);
2608 if (num == 1) {
2609 /* small_stmt or compound_stmt with only one child */
2610 s = ast_for_stmt(c, ch);
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 else {
2616 int j;
2617 ch = CHILD(ch, 0);
2618 REQ(ch, simple_stmt);
2619 for (j = 0; j < NCH(ch); j += 2) {
2620 /* statement terminates with a semi-colon ';' */
2621 if (NCH(CHILD(ch, j)) == 0) {
2622 assert((j + 1) == NCH(ch));
2623 break;
2624 }
2625 s = ast_for_stmt(c, CHILD(ch, j));
2626 if (!s)
2627 return NULL;
2628 asdl_seq_SET(seq, pos++, s);
2629 }
2630 }
2631 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 }
2633 assert(pos == seq->size);
2634 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635}
2636
2637static stmt_ty
2638ast_for_if_stmt(struct compiling *c, const node *n)
2639{
2640 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2641 ['else' ':' suite]
2642 */
2643 char *s;
2644
2645 REQ(n, if_stmt);
2646
2647 if (NCH(n) == 4) {
2648 expr_ty expression;
2649 asdl_seq *suite_seq;
2650
2651 expression = ast_for_expr(c, CHILD(n, 1));
2652 if (!expression)
2653 return NULL;
2654 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 return NULL;
2657
Guido van Rossumd8faa362007-04-27 19:54:29 +00002658 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2659 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 s = STR(CHILD(n, 4));
2663 /* s[2], the third character in the string, will be
2664 's' for el_s_e, or
2665 'i' for el_i_f
2666 */
2667 if (s[2] == 's') {
2668 expr_ty expression;
2669 asdl_seq *seq1, *seq2;
2670
2671 expression = ast_for_expr(c, CHILD(n, 1));
2672 if (!expression)
2673 return NULL;
2674 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
2677 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002678 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 return NULL;
2680
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2682 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 }
2684 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002686 expr_ty expression;
2687 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 asdl_seq *orelse = NULL;
2689 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 /* must reference the child n_elif+1 since 'else' token is third,
2691 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2693 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2694 has_else = 1;
2695 n_elif -= 3;
2696 }
2697 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698
Thomas Wouters89f507f2006-12-13 04:49:30 +00002699 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002700 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701
Thomas Wouters89f507f2006-12-13 04:49:30 +00002702 orelse = asdl_seq_new(1, c->c_arena);
2703 if (!orelse)
2704 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002706 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002708 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2709 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002711 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2712 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714
Guido van Rossumd8faa362007-04-27 19:54:29 +00002715 asdl_seq_SET(orelse, 0,
2716 If(expression, suite_seq, suite_seq2,
2717 LINENO(CHILD(n, NCH(n) - 6)),
2718 CHILD(n, NCH(n) - 6)->n_col_offset,
2719 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 /* the just-created orelse handled the last elif */
2721 n_elif--;
2722 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723
Thomas Wouters89f507f2006-12-13 04:49:30 +00002724 for (i = 0; i < n_elif; i++) {
2725 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2727 if (!newobj)
2728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002730 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002733 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735
Thomas Wouters89f507f2006-12-13 04:49:30 +00002736 asdl_seq_SET(newobj, 0,
2737 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002738 LINENO(CHILD(n, off)),
2739 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002740 orelse = newobj;
2741 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002742 expression = ast_for_expr(c, CHILD(n, 1));
2743 if (!expression)
2744 return NULL;
2745 suite_seq = ast_for_suite(c, CHILD(n, 3));
2746 if (!suite_seq)
2747 return NULL;
2748 return If(expression, suite_seq, orelse,
2749 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751
2752 PyErr_Format(PyExc_SystemError,
2753 "unexpected token in 'if' statement: %s", s);
2754 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755}
2756
2757static stmt_ty
2758ast_for_while_stmt(struct compiling *c, const node *n)
2759{
2760 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2761 REQ(n, while_stmt);
2762
2763 if (NCH(n) == 4) {
2764 expr_ty expression;
2765 asdl_seq *suite_seq;
2766
2767 expression = ast_for_expr(c, CHILD(n, 1));
2768 if (!expression)
2769 return NULL;
2770 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002773 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 }
2775 else if (NCH(n) == 7) {
2776 expr_ty expression;
2777 asdl_seq *seq1, *seq2;
2778
2779 expression = ast_for_expr(c, CHILD(n, 1));
2780 if (!expression)
2781 return NULL;
2782 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002783 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 return NULL;
2785 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 return NULL;
2788
Thomas Wouters89f507f2006-12-13 04:49:30 +00002789 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002791
2792 PyErr_Format(PyExc_SystemError,
2793 "wrong number of tokens for 'while' statement: %d",
2794 NCH(n));
2795 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796}
2797
2798static stmt_ty
2799ast_for_for_stmt(struct compiling *c, const node *n)
2800{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 expr_ty expression;
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002803 expr_ty target, first;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002804 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2806 REQ(n, for_stmt);
2807
2808 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 if (!seq)
2811 return NULL;
2812 }
2813
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002814 node_target = CHILD(n, 1);
2815 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002816 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002818 /* Check the # of children rather than the length of _target, since
2819 for x, in ... has 1 element in _target, but still requires a Tuple. */
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002820 first = (expr_ty)asdl_seq_GET(_target, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002821 if (NCH(node_target) == 1)
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002822 target = first;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 else
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +00002824 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002826 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 return NULL;
2829 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002830 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002831 return NULL;
2832
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002833 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2834 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835}
2836
2837static excepthandler_ty
2838ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2839{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002840 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 REQ(exc, except_clause);
2842 REQ(body, suite);
2843
2844 if (NCH(exc) == 1) {
2845 asdl_seq *suite_seq = ast_for_suite(c, body);
2846 if (!suite_seq)
2847 return NULL;
2848
Neal Norwitzad74aa82008-03-31 05:14:30 +00002849 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002850 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002851 }
2852 else if (NCH(exc) == 2) {
2853 expr_ty expression;
2854 asdl_seq *suite_seq;
2855
2856 expression = ast_for_expr(c, CHILD(exc, 1));
2857 if (!expression)
2858 return NULL;
2859 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862
Neal Norwitzad74aa82008-03-31 05:14:30 +00002863 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002864 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
2866 else if (NCH(exc) == 4) {
2867 asdl_seq *suite_seq;
2868 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002869 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002870 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002872 if (forbidden_name(e, CHILD(exc, 3), 0))
2873 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002875 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876 return NULL;
2877 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002878 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879 return NULL;
2880
Neal Norwitzad74aa82008-03-31 05:14:30 +00002881 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002882 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002884
2885 PyErr_Format(PyExc_SystemError,
2886 "wrong number of children for 'except' clause: %d",
2887 NCH(exc));
2888 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889}
2890
2891static stmt_ty
2892ast_for_try_stmt(struct compiling *c, const node *n)
2893{
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 const int nch = NCH(n);
2895 int n_except = (nch - 3)/3;
2896 asdl_seq *body, *orelse = NULL, *finally = NULL;
2897
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 REQ(n, try_stmt);
2899
Neal Norwitzf599f422005-12-17 21:33:47 +00002900 body = ast_for_suite(c, CHILD(n, 2));
2901 if (body == NULL)
2902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903
Neal Norwitzf599f422005-12-17 21:33:47 +00002904 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2905 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2906 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2907 /* we can assume it's an "else",
2908 because nch >= 9 for try-else-finally and
2909 it would otherwise have a type of except_clause */
2910 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2911 if (orelse == NULL)
2912 return NULL;
2913 n_except--;
2914 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915
Neal Norwitzf599f422005-12-17 21:33:47 +00002916 finally = ast_for_suite(c, CHILD(n, nch - 1));
2917 if (finally == NULL)
2918 return NULL;
2919 n_except--;
2920 }
2921 else {
2922 /* we can assume it's an "else",
2923 otherwise it would have a type of except_clause */
2924 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2925 if (orelse == NULL)
2926 return NULL;
2927 n_except--;
2928 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002929 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002930 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002931 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 return NULL;
2933 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002934
2935 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 int i;
2937 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002938 /* process except statements to create a try ... except */
2939 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2940 if (handlers == NULL)
2941 return NULL;
2942
2943 for (i = 0; i < n_except; i++) {
2944 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2945 CHILD(n, 5 + i * 3));
2946 if (!e)
2947 return NULL;
2948 asdl_seq_SET(handlers, i, e);
2949 }
2950
Thomas Wouters89f507f2006-12-13 04:49:30 +00002951 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002952 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002953 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002954 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002955
2956 /* if a 'finally' is present too, we nest the TryExcept within a
2957 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002958 body = asdl_seq_new(1, c->c_arena);
2959 if (body == NULL)
2960 return NULL;
2961 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002962 }
2963
2964 /* must be a try ... finally (except clauses are in body, if any exist) */
2965 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002966 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967}
2968
Georg Brandl0c315622009-05-25 21:10:36 +00002969/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002970static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002971ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002972{
2973 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002974
Georg Brandl0c315622009-05-25 21:10:36 +00002975 REQ(n, with_item);
2976 context_expr = ast_for_expr(c, CHILD(n, 0));
2977 if (NCH(n) == 3) {
2978 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002979
2980 if (!optional_vars) {
2981 return NULL;
2982 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002983 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 return NULL;
2985 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002986 }
2987
Georg Brandl0c315622009-05-25 21:10:36 +00002988 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002989 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002990}
2991
Georg Brandl0c315622009-05-25 21:10:36 +00002992/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2993static stmt_ty
2994ast_for_with_stmt(struct compiling *c, const node *n)
2995{
2996 int i;
2997 stmt_ty ret;
2998 asdl_seq *inner;
2999
3000 REQ(n, with_stmt);
3001
3002 /* process the with items inside-out */
3003 i = NCH(n) - 1;
3004 /* the suite of the innermost with item is the suite of the with stmt */
3005 inner = ast_for_suite(c, CHILD(n, i));
3006 if (!inner)
3007 return NULL;
3008
3009 for (;;) {
3010 i -= 2;
3011 ret = ast_for_with_item(c, CHILD(n, i), inner);
3012 if (!ret)
3013 return NULL;
3014 /* was this the last item? */
3015 if (i == 1)
3016 break;
3017 /* if not, wrap the result so far in a new sequence */
3018 inner = asdl_seq_new(1, c->c_arena);
3019 if (!inner)
3020 return NULL;
3021 asdl_seq_SET(inner, 0, ret);
3022 }
3023
3024 return ret;
3025}
3026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003028ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003030 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003031 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003032 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003033 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003034
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 REQ(n, classdef);
3036
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003037 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 s = ast_for_suite(c, CHILD(n, 3));
3039 if (!s)
3040 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003041 classname = NEW_IDENTIFIER(CHILD(n, 1));
3042 if (!classname)
3043 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003044 if (forbidden_name(classname, CHILD(n, 3), 0))
3045 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003046 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3047 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003049
3050 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003051 s = ast_for_suite(c, CHILD(n,5));
3052 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003053 return NULL;
3054 classname = NEW_IDENTIFIER(CHILD(n, 1));
3055 if (!classname)
3056 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003057 if (forbidden_name(classname, CHILD(n, 3), 0))
3058 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003059 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3060 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061 }
3062
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003063 /* class NAME '(' arglist ')' ':' suite */
3064 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003065 {
3066 PyObject *dummy_name;
3067 expr_ty dummy;
3068 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3069 if (!dummy_name)
3070 return NULL;
3071 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3072 call = ast_for_call(c, CHILD(n, 3), dummy);
3073 if (!call)
3074 return NULL;
3075 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003077 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003079 classname = NEW_IDENTIFIER(CHILD(n, 1));
3080 if (!classname)
3081 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003082 if (forbidden_name(classname, CHILD(n, 1), 0))
3083 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003084
Benjamin Peterson30760062008-11-25 04:02:28 +00003085 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003086 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003087 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088}
3089
3090static stmt_ty
3091ast_for_stmt(struct compiling *c, const node *n)
3092{
3093 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003094 assert(NCH(n) == 1);
3095 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096 }
3097 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003098 assert(num_stmts(n) == 1);
3099 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 }
3101 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003102 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003103 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3104 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003105 */
3106 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 case expr_stmt:
3108 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 case del_stmt:
3110 return ast_for_del_stmt(c, n);
3111 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003112 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 case flow_stmt:
3114 return ast_for_flow_stmt(c, n);
3115 case import_stmt:
3116 return ast_for_import_stmt(c, n);
3117 case global_stmt:
3118 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003119 case nonlocal_stmt:
3120 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121 case assert_stmt:
3122 return ast_for_assert_stmt(c, n);
3123 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003124 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3126 TYPE(n), NCH(n));
3127 return NULL;
3128 }
3129 }
3130 else {
3131 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003132 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003133 */
3134 node *ch = CHILD(n, 0);
3135 REQ(n, compound_stmt);
3136 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 case if_stmt:
3138 return ast_for_if_stmt(c, ch);
3139 case while_stmt:
3140 return ast_for_while_stmt(c, ch);
3141 case for_stmt:
3142 return ast_for_for_stmt(c, ch);
3143 case try_stmt:
3144 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003145 case with_stmt:
3146 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003148 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003150 return ast_for_classdef(c, ch, NULL);
3151 case decorated:
3152 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003154 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3156 TYPE(n), NCH(n));
3157 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003158 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159 }
3160}
3161
3162static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003163parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 const char *end;
3166 long x;
3167 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003169 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171#endif
3172
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003173 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 errno = 0;
3175 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003177 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003178#endif
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 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003197 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003198 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3199 if (compl.imag == -1.0 && PyErr_Occurred())
3200 return NULL;
3201 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 }
3203 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003206 dx = PyOS_string_to_double(s, NULL, NULL);
3207 if (dx == -1.0 && PyErr_Occurred())
3208 return NULL;
3209 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211}
3212
3213static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003214decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003216 PyObject *u, *v;
3217 char *s, *t;
3218 t = s = (char *)*sPtr;
3219 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3220 while (s < end && (*s & 0x80)) s++;
3221 *sPtr = s;
3222 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3223 if (u == NULL)
3224 return NULL;
3225 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3226 Py_DECREF(u);
3227 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228}
3229
3230static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003231decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 PyObject *v, *u;
3234 char *buf;
3235 char *p;
3236 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003237
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 if (encoding == NULL) {
3239 buf = (char *)s;
3240 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003242 /* check for integer overflow */
3243 if (len > PY_SIZE_MAX / 4)
3244 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003245 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003246 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 if (u == NULL)
3248 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003249 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003250 end = s + len;
3251 while (s < end) {
3252 if (*s == '\\') {
3253 *p++ = *s++;
3254 if (*s & 0x80) {
3255 strcpy(p, "u005c");
3256 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003257 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003258 }
3259 if (*s & 0x80) { /* XXX inefficient */
3260 PyObject *w;
3261 char *r;
3262 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003263 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 if (w == NULL) {
3265 Py_DECREF(u);
3266 return NULL;
3267 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003268 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003269 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 assert(rn % 2 == 0);
3271 for (i = 0; i < rn; i += 2) {
3272 sprintf(p, "\\u%02x%02x",
3273 r[i + 0] & 0xFF,
3274 r[i + 1] & 0xFF);
3275 p += 6;
3276 }
3277 Py_DECREF(w);
3278 } else {
3279 *p++ = *s++;
3280 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003281 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003282 len = p - buf;
3283 s = buf;
3284 }
3285 if (rawmode)
3286 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3287 else
3288 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3289 Py_XDECREF(u);
3290 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291}
3292
3293/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003294 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295 * parsestr parses it, and returns the decoded Python string object.
3296 */
3297static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003298parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003300 size_t len;
3301 const char *s = STR(n);
3302 int quote = Py_CHARMASK(*s);
3303 int rawmode = 0;
3304 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003305 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 if (quote == 'b' || quote == 'B') {
3307 quote = *++s;
3308 *bytesmode = 1;
3309 }
3310 if (quote == 'r' || quote == 'R') {
3311 quote = *++s;
3312 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 }
3315 if (quote != '\'' && quote != '\"') {
3316 PyErr_BadInternalCall();
3317 return NULL;
3318 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003319 s++;
3320 len = strlen(s);
3321 if (len > INT_MAX) {
3322 PyErr_SetString(PyExc_OverflowError,
3323 "string to parse is too long");
3324 return NULL;
3325 }
3326 if (s[--len] != quote) {
3327 PyErr_BadInternalCall();
3328 return NULL;
3329 }
3330 if (len >= 4 && s[0] == quote && s[1] == quote) {
3331 s += 2;
3332 len -= 2;
3333 if (s[--len] != quote || s[--len] != quote) {
3334 PyErr_BadInternalCall();
3335 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003336 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003338 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003339 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003340 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003341 if (*bytesmode) {
3342 /* Disallow non-ascii characters (but not escapes) */
3343 const char *c;
3344 for (c = s; *c; c++) {
3345 if (Py_CHARMASK(*c) >= 0x80) {
3346 ast_error(n, "bytes can only contain ASCII "
3347 "literal characters.");
3348 return NULL;
3349 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003350 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003352 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003353 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003354 if (rawmode || strchr(s, '\\') == NULL) {
3355 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003357 if (u == NULL || !*bytesmode)
3358 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003359 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003360 Py_DECREF(u);
3361 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003362 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003363 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003364 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003365 return PyUnicode_FromStringAndSize(s, len);
3366 } else {
3367 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003368 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003369 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003370 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003371 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003372}
3373
Guido van Rossum29fd7122007-11-12 01:13:56 +00003374/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375 * compile-time literal catenation, calling parsestr() on each piece, and
3376 * pasting the intermediate results together.
3377 */
3378static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003379parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 PyObject *v;
3382 int i;
3383 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003384 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003385 if (v != NULL) {
3386 /* String literal concatenation */
3387 for (i = 1; i < NCH(n); i++) {
3388 PyObject *s;
3389 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003390 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003391 if (s == NULL)
3392 goto onError;
3393 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003394 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003395 goto onError;
3396 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003397 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3398 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003399 if (v == NULL)
3400 goto onError;
3401 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003402 else {
3403 PyObject *temp = PyUnicode_Concat(v, s);
3404 Py_DECREF(s);
3405 Py_DECREF(v);
3406 v = temp;
3407 if (v == NULL)
3408 goto onError;
3409 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003410 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003411 }
3412 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413
Guido van Rossumd8faa362007-04-27 19:54:29 +00003414 onError:
3415 Py_XDECREF(v);
3416 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003417}