blob: 2a806af51aab86d807a3f63331f5a40f115d63cc [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",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000360 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 NULL,
362};
363
364static int
365forbidden_name(expr_ty e, const node *n)
366{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000368 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000369 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000370 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 ast_error(n, "assignment to keyword");
372 return 1;
373 }
374 }
375 return 0;
376}
377
Jeremy Hyltona8293132006-02-28 17:58:27 +0000378/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
380 Only sets context for expr kinds that "can appear in assignment context"
381 (according to ../Parser/Python.asdl). For other expr kinds, it sets
382 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000386set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
388 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389 /* If a particular expression type can't be used for assign / delete,
390 set expr_name to its name and an error message will be generated.
391 */
392 const char* expr_name = NULL;
393
394 /* The ast defines augmented store and load contexts, but the
395 implementation here doesn't actually use them. The code may be
396 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000399 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 */
401 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402
403 switch (e->kind) {
404 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Attribute.ctx = ctx;
406 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000408 e->v.Subscript.ctx = ctx;
409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 case Starred_kind:
411 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000412 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000413 return 0;
414 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000416 if (ctx == Store) {
417 if (forbidden_name(e, n))
418 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 }
420 e->v.Name.ctx = ctx;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.List.ctx = ctx;
424 s = e->v.List.elts;
425 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 case Tuple_kind:
427 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
428 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Tuple.ctx = ctx;
430 s = e->v.Tuple.elts;
431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case Lambda_kind:
433 expr_name = "lambda";
434 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 case UnaryOp_kind:
441 expr_name = "operator";
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000444 expr_name = "generator expression";
445 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000446 case Yield_kind:
447 expr_name = "yield expression";
448 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000449 case ListComp_kind:
450 expr_name = "list comprehension";
451 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000452 case SetComp_kind:
453 expr_name = "set comprehension";
454 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000455 case DictComp_kind:
456 expr_name = "dict comprehension";
457 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000459 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 case Num_kind:
461 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 expr_name = "literal";
463 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000464 case Ellipsis_kind:
465 expr_name = "Ellipsis";
466 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000467 case Compare_kind:
468 expr_name = "comparison";
469 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 case IfExp_kind:
471 expr_name = "conditional expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 default:
474 PyErr_Format(PyExc_SystemError,
475 "unexpected expression in assignment %d (line %d)",
476 e->kind, e->lineno);
477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000479 /* Check for error string set by switch */
480 if (expr_name) {
481 char buf[300];
482 PyOS_snprintf(buf, sizeof(buf),
483 "can't %s %s",
484 ctx == Store ? "assign to" : "delete",
485 expr_name);
486 return ast_error(n, buf);
487 }
488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000490 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000491 */
492 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000496 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 return 0;
498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 }
500 return 1;
501}
502
503static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000504ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505{
506 REQ(n, augassign);
507 n = CHILD(n, 0);
508 switch (STR(n)[0]) {
509 case '+':
510 return Add;
511 case '-':
512 return Sub;
513 case '/':
514 if (STR(n)[1] == '/')
515 return FloorDiv;
516 else
517 return Div;
518 case '%':
519 return Mod;
520 case '<':
521 return LShift;
522 case '>':
523 return RShift;
524 case '&':
525 return BitAnd;
526 case '^':
527 return BitXor;
528 case '|':
529 return BitOr;
530 case '*':
531 if (STR(n)[1] == '*')
532 return Pow;
533 else
534 return Mult;
535 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000536 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538 }
539}
540
541static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000542ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000544 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 |'is' 'not'
546 */
547 REQ(n, comp_op);
548 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 n = CHILD(n, 0);
550 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551 case LESS:
552 return Lt;
553 case GREATER:
554 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000555 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 return Eq;
557 case LESSEQUAL:
558 return LtE;
559 case GREATEREQUAL:
560 return GtE;
561 case NOTEQUAL:
562 return NotEq;
563 case NAME:
564 if (strcmp(STR(n), "in") == 0)
565 return In;
566 if (strcmp(STR(n), "is") == 0)
567 return Is;
568 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000569 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000571 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 /* handle "not in" and "is not" */
576 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 case NAME:
578 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
579 return NotIn;
580 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
581 return IsNot;
582 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000583 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000585 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Neal Norwitz79792652005-11-14 04:25:03 +0000588 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591}
592
593static asdl_seq *
594seq_for_testlist(struct compiling *c, const node *n)
595{
596 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000597 asdl_seq *seq;
598 expr_ty expression;
599 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000602 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 if (!seq)
604 return NULL;
605
606 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000607 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
613 assert(i / 2 < seq->size);
614 asdl_seq_SET(seq, i / 2, expression);
615 }
616 return seq;
617}
618
Neal Norwitzc1505362006-12-28 06:47:50 +0000619static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000621{
622 identifier name;
623 expr_ty annotation = NULL;
624 node *ch;
625
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000626 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000627 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 name = NEW_IDENTIFIER(ch);
629 if (!name)
630 return NULL;
631
632 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
633 annotation = ast_for_expr(c, CHILD(n, 2));
634 if (!annotation)
635 return NULL;
636 }
637
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000639#if 0
640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
641 if (!set_context(c, result, Store, n))
642 return NULL;
643 return result;
644#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645}
646
Guido van Rossum4f72a782006-10-27 23:31:49 +0000647/* returns -1 if failed to handle keyword only arguments
648 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 ^^^
651 start pointing here
652 */
653static int
654handle_keywordonly_args(struct compiling *c, const node *n, int start,
655 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
656{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000657 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000659 expr_ty expression, annotation;
660 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 int i = start;
662 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000663
664 if (kwonlyargs == NULL) {
665 ast_error(CHILD(n, start), "named arguments must follow bare *");
666 return -1;
667 }
668 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 while (i < NCH(n)) {
670 ch = CHILD(n, i);
671 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000672 case vfpdef:
673 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000675 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000676 asdl_seq_SET(kwdefaults, j, expression);
677 i += 2; /* '=' and test */
678 }
679 else { /* setting NULL if no default value exists */
680 asdl_seq_SET(kwdefaults, j, NULL);
681 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000682 if (NCH(ch) == 3) {
683 /* ch is NAME ':' test */
684 annotation = ast_for_expr(c, CHILD(ch, 2));
685 if (!annotation) {
686 ast_error(ch, "expected expression");
687 goto error;
688 }
689 }
690 else {
691 annotation = NULL;
692 }
693 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000694 argname = NEW_IDENTIFIER(ch);
695 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000696 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000697 arg = arg(argname, annotation, c->c_arena);
698 if (!arg)
699 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000700 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000701 i += 2; /* the name and the comma */
702 break;
703 case DOUBLESTAR:
704 return i;
705 default:
706 ast_error(ch, "unexpected node");
707 goto error;
708 }
709 }
710 return i;
711 error:
712 return -1;
713}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
Jeremy Hyltona8293132006-02-28 17:58:27 +0000715/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716
717static arguments_ty
718ast_for_arguments(struct compiling *c, const node *n)
719{
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 /* This function handles both typedargslist (function definition)
721 and varargslist (lambda definition).
722
723 parameters: '(' [typedargslist] ')'
724 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000725 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
726 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000729 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000730 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
731 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000732 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000733 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 int i, j, k, nposargs = 0, nkwonlyargs = 0;
736 int nposdefaults = 0, found_default = 0;
737 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 arg_ty arg;
740 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 node *ch;
742
743 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000745 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
746 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750
Jeremy Hyltone921e022008-07-17 16:37:17 +0000751 /* First count the number of positional args & defaults. The
752 variable i is the loop index for this for loop and the next.
753 The next loop picks up where the first leaves off.
754 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000756 ch = CHILD(n, i);
757 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000758 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000759 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000760 if (i < NCH(n) && /* skip argument following star */
761 (TYPE(CHILD(n, i)) == tfpdef ||
762 TYPE(CHILD(n, i)) == vfpdef)) {
763 i++;
764 }
765 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000767 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000768 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000771 /* count the number of keyword only args &
772 defaults for keyword only args */
773 for ( ; i < NCH(n); ++i) {
774 ch = CHILD(n, i);
775 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000776 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
779 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 kwonlyargs = (nkwonlyargs ?
782 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
783 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000784 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 posdefaults = (nposdefaults ?
786 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
787 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000788 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000789 /* The length of kwonlyargs and kwdefaults are same
790 since we set NULL as default for keyword only argument w/o default
791 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000792 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000793 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
794 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000795 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796
797 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 ast_error(n, "more than 255 arguments");
799 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000802 /* tfpdef: NAME [':' test]
803 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 */
805 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000806 j = 0; /* index for defaults */
807 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000809 ch = CHILD(n, i);
810 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000811 case tfpdef:
812 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
814 anything other than EQUAL or a comma? */
815 /* XXX Should NCH(n) check be made a separate check? */
816 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000817 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
818 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000819 goto error;
820 assert(posdefaults != NULL);
821 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000824 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000825 else if (found_default) {
826 ast_error(n,
827 "non-default argument follows default argument");
828 goto error;
829 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000830 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000831 if (!arg)
832 goto error;
833 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 i += 2; /* the name and the comma */
835 break;
836 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000838 ast_error(CHILD(n, i),
839 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000840 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000842 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 if (TYPE(ch) == COMMA) {
844 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000845 i += 2; /* now follows keyword only arguments */
846 res = handle_keywordonly_args(c, n, i,
847 kwonlyargs, kwdefaults);
848 if (res == -1) goto error;
849 i = res; /* res has new position to process */
850 }
851 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000853 if (!vararg)
854 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000856 /* there is an annotation on the vararg */
857 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000860 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
861 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 int res = 0;
863 res = handle_keywordonly_args(c, n, i,
864 kwonlyargs, kwdefaults);
865 if (res == -1) goto error;
866 i = res; /* res has new position to process */
867 }
868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869 break;
870 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000871 ch = CHILD(n, i+1); /* tfpdef */
872 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000873 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
874 if (NCH(ch) > 1) {
875 /* there is an annotation on the kwarg */
876 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
877 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000878 if (!kwarg)
879 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 i += 3;
881 break;
882 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000883 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000884 "unexpected node in varargslist: %d @ %d",
885 TYPE(ch), i);
886 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000887 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
890 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000892 Py_XDECREF(vararg);
893 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 return NULL;
895}
896
897static expr_ty
898ast_for_dotted_name(struct compiling *c, const node *n)
899{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000900 expr_ty e;
901 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000902 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 int i;
904
905 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000906
907 lineno = LINENO(n);
908 col_offset = n->n_col_offset;
909
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910 id = NEW_IDENTIFIER(CHILD(n, 0));
911 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000912 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000913 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916
917 for (i = 2; i < NCH(n); i+=2) {
918 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000919 if (!id)
920 return NULL;
921 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
922 if (!e)
923 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 }
925
926 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929static expr_ty
930ast_for_decorator(struct compiling *c, const node *n)
931{
932 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
933 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000934 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935
936 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000937 REQ(CHILD(n, 0), AT);
938 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939
940 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
941 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 return NULL;
943
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 d = name_expr;
946 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 }
948 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000950 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000951 if (!d)
952 return NULL;
953 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 }
955 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000956 d = ast_for_call(c, CHILD(n, 3), name_expr);
957 if (!d)
958 return NULL;
959 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960 }
961
962 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static asdl_seq*
966ast_for_decorators(struct compiling *c, const node *n)
967{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000968 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000969 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 int i;
971
972 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000973 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 if (!decorator_seq)
975 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000978 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 if (!d)
980 return NULL;
981 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 }
983 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984}
985
986static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000987ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000989 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000990 identifier name;
991 arguments_ty args;
992 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000993 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000994 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995
996 REQ(n, funcdef);
997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 name = NEW_IDENTIFIER(CHILD(n, name_i));
999 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1002 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001003 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001004 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1005 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1006 if (!returns)
1007 return NULL;
1008 name_i += 2;
1009 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 body = ast_for_suite(c, CHILD(n, name_i + 3));
1011 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001012 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001015 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016}
1017
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001018static stmt_ty
1019ast_for_decorated(struct compiling *c, const node *n)
1020{
1021 /* decorated: decorators (classdef | funcdef) */
1022 stmt_ty thing = NULL;
1023 asdl_seq *decorator_seq = NULL;
1024
1025 REQ(n, decorated);
1026
1027 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1028 if (!decorator_seq)
1029 return NULL;
1030
1031 assert(TYPE(CHILD(n, 1)) == funcdef ||
1032 TYPE(CHILD(n, 1)) == classdef);
1033
1034 if (TYPE(CHILD(n, 1)) == funcdef) {
1035 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1036 } else if (TYPE(CHILD(n, 1)) == classdef) {
1037 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1038 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001039 /* we count the decorators in when talking about the class' or
1040 * function's line number */
1041 if (thing) {
1042 thing->lineno = LINENO(n);
1043 thing->col_offset = n->n_col_offset;
1044 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001045 return thing;
1046}
1047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048static expr_ty
1049ast_for_lambdef(struct compiling *c, const node *n)
1050{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001051 /* lambdef: 'lambda' [varargslist] ':' test
1052 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 arguments_ty args;
1054 expr_ty expression;
1055
1056 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001057 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1058 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 if (!args)
1060 return NULL;
1061 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001062 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 }
1065 else {
1066 args = ast_for_arguments(c, CHILD(n, 1));
1067 if (!args)
1068 return NULL;
1069 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001070 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072 }
1073
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001074 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001077static expr_ty
1078ast_for_ifexpr(struct compiling *c, const node *n)
1079{
1080 /* test: or_test 'if' or_test 'else' test */
1081 expr_ty expression, body, orelse;
1082
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001083 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001084 body = ast_for_expr(c, CHILD(n, 0));
1085 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087 expression = ast_for_expr(c, CHILD(n, 2));
1088 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001090 orelse = ast_for_expr(c, CHILD(n, 4));
1091 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001093 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1094 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001095}
1096
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001098 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099
Nick Coghlan650f0d02007-04-15 12:05:43 +00001100 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101*/
1102
1103static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001104count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 count_comp_for:
1109 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001110 REQ(n, comp_for);
1111 if (NCH(n) == 5)
1112 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001113 else
1114 return n_fors;
1115 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001116 REQ(n, comp_iter);
1117 n = CHILD(n, 0);
1118 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001119 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001120 else if (TYPE(n) == comp_if) {
1121 if (NCH(n) == 3) {
1122 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001123 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001124 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001125 else
1126 return n_fors;
1127 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001128
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 /* Should never be reached */
1130 PyErr_SetString(PyExc_SystemError,
1131 "logic error in count_comp_fors");
1132 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133}
1134
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Nick Coghlan650f0d02007-04-15 12:05:43 +00001137 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138*/
1139
1140static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001141count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 while (1) {
1146 REQ(n, comp_iter);
1147 if (TYPE(CHILD(n, 0)) == comp_for)
1148 return n_ifs;
1149 n = CHILD(n, 0);
1150 REQ(n, comp_if);
1151 n_ifs++;
1152 if (NCH(n) == 2)
1153 return n_ifs;
1154 n = CHILD(n, 2);
1155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156}
1157
Guido van Rossum992d4a32007-07-11 13:09:30 +00001158static asdl_seq *
1159ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001162 asdl_seq *comps;
1163
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001164 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 if (n_fors == -1)
1166 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167
Nick Coghlan650f0d02007-04-15 12:05:43 +00001168 comps = asdl_seq_new(n_fors, c->c_arena);
1169 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001171
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001173 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 asdl_seq *t;
1175 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001176 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179
Guido van Rossum992d4a32007-07-11 13:09:30 +00001180 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001181 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001184 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187
Thomas Wouters89f507f2006-12-13 04:49:30 +00001188 /* Check the # of children rather than the length of t, since
1189 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1190 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001191 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1192 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 c->c_arena),
1196 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
Guido van Rossum992d4a32007-07-11 13:09:30 +00001201 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 int j, n_ifs;
1203 asdl_seq *ifs;
1204
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001206 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209
1210 ifs = asdl_seq_new(n_ifs, c->c_arena);
1211 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 REQ(n, comp_iter);
1216 n = CHILD(n, 0);
1217 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218
Guido van Rossum992d4a32007-07-11 13:09:30 +00001219 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001221 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001222 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 if (NCH(n) == 3)
1224 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001226 /* on exit, must guarantee that n is a comp_for */
1227 if (TYPE(n) == comp_iter)
1228 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001231 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001233 return comps;
1234}
1235
1236static expr_ty
1237ast_for_itercomp(struct compiling *c, const node *n, int type)
1238{
1239 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1240 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1241 expr_ty elt;
1242 asdl_seq *comps;
1243
1244 assert(NCH(n) > 1);
1245
1246 elt = ast_for_expr(c, CHILD(n, 0));
1247 if (!elt)
1248 return NULL;
1249
1250 comps = ast_for_comprehension(c, CHILD(n, 1));
1251 if (!comps)
1252 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001253
1254 if (type == COMP_GENEXP)
1255 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1256 else if (type == COMP_LISTCOMP)
1257 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1258 else if (type == COMP_SETCOMP)
1259 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1260 else
1261 /* Should never happen */
1262 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001266ast_for_dictcomp(struct compiling *c, const node *n)
1267{
1268 expr_ty key, value;
1269 asdl_seq *comps;
1270
1271 assert(NCH(n) > 3);
1272 REQ(CHILD(n, 1), COLON);
1273
1274 key = ast_for_expr(c, CHILD(n, 0));
1275 if (!key)
1276 return NULL;
1277
1278 value = ast_for_expr(c, CHILD(n, 2));
1279 if (!value)
1280 return NULL;
1281
1282 comps = ast_for_comprehension(c, CHILD(n, 3));
1283 if (!comps)
1284 return NULL;
1285
1286 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1287}
1288
1289static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001290ast_for_genexp(struct compiling *c, const node *n)
1291{
1292 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001293 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001294}
1295
1296static expr_ty
1297ast_for_listcomp(struct compiling *c, const node *n)
1298{
1299 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001300 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001301}
1302
1303static expr_ty
1304ast_for_setcomp(struct compiling *c, const node *n)
1305{
1306 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001307 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001308}
1309
1310
1311static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312ast_for_atom(struct compiling *c, const node *n)
1313{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001314 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1315 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001316 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317 */
1318 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001319 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320
1321 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001322 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001323 /* All names start in Load context, but may later be
1324 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001325 PyObject *name = NEW_IDENTIFIER(ch);
1326 if (!name)
1327 return NULL;
1328 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001331 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001333 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001334 PyObject *type, *value, *tback, *errstr;
1335 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001336 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001337 if (errstr) {
1338 char *s = "";
1339 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001340 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001341 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1342 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001343 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001344 } else {
1345 ast_error(n, "(unicode error) unknown error");
1346 }
1347 Py_DECREF(type);
1348 Py_DECREF(value);
1349 Py_XDECREF(tback);
1350 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001353 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001354 if (bytesmode)
1355 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1356 else
1357 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 }
1359 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001360 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 if (!pynum)
1362 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001363
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 PyArena_AddPyObject(c->c_arena, pynum);
1365 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 }
Georg Brandldde00282007-03-18 19:01:53 +00001367 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001368 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370 ch = CHILD(n, 1);
1371
1372 if (TYPE(ch) == RPAR)
1373 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1374
1375 if (TYPE(ch) == yield_expr)
1376 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001377
1378 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1379 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 return ast_for_genexp(c, ch);
1381
Nick Coghlan650f0d02007-04-15 12:05:43 +00001382 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 ch = CHILD(n, 1);
1385
1386 if (TYPE(ch) == RSQB)
1387 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1388
Nick Coghlan650f0d02007-04-15 12:05:43 +00001389 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1391 asdl_seq *elts = seq_for_testlist(c, ch);
1392 if (!elts)
1393 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001394
Thomas Wouters89f507f2006-12-13 04:49:30 +00001395 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1396 }
1397 else
1398 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001400 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1401 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001402 int i, size;
1403 asdl_seq *keys, *values;
1404
1405 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001406 if (TYPE(ch) == RBRACE) {
1407 /* it's an empty dict */
1408 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1409 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1410 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001411 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001412 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001413 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001414 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001415 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001416 for (i = 0; i < NCH(ch); i += 2) {
1417 expr_ty expression;
1418 expression = ast_for_expr(c, CHILD(ch, i));
1419 if (!expression)
1420 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001422 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001423 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1424 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1425 /* it's a set comprehension */
1426 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001427 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1428 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001429 } else {
1430 /* it's a dict */
1431 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1432 keys = asdl_seq_new(size, c->c_arena);
1433 if (!keys)
1434 return NULL;
1435
1436 values = asdl_seq_new(size, c->c_arena);
1437 if (!values)
1438 return NULL;
1439
1440 for (i = 0; i < NCH(ch); i += 4) {
1441 expr_ty expression;
1442
1443 expression = ast_for_expr(c, CHILD(ch, i));
1444 if (!expression)
1445 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001446
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001448
Guido van Rossum86e58e22006-08-28 15:27:34 +00001449 expression = ast_for_expr(c, CHILD(ch, i + 2));
1450 if (!expression)
1451 return NULL;
1452
1453 asdl_seq_SET(values, i / 4, expression);
1454 }
1455 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1456 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001459 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1460 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 }
1462}
1463
1464static slice_ty
1465ast_for_slice(struct compiling *c, const node *n)
1466{
1467 node *ch;
1468 expr_ty lower = NULL, upper = NULL, step = NULL;
1469
1470 REQ(n, subscript);
1471
1472 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001473 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 sliceop: ':' [test]
1475 */
1476 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (NCH(n) == 1 && TYPE(ch) == test) {
1478 /* 'step' variable hold no significance in terms of being used over
1479 other vars */
1480 step = ast_for_expr(c, ch);
1481 if (!step)
1482 return NULL;
1483
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 }
1486
1487 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001488 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!lower)
1490 return NULL;
1491 }
1492
1493 /* If there's an upper bound it's in the second or third position. */
1494 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (NCH(n) > 1) {
1496 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 if (TYPE(n2) == test) {
1499 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500 if (!upper)
1501 return NULL;
1502 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
Thomas Wouters89f507f2006-12-13 04:49:30 +00001507 if (TYPE(n2) == test) {
1508 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!upper)
1510 return NULL;
1511 }
1512 }
1513
1514 ch = CHILD(n, NCH(n) - 1);
1515 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516 if (NCH(ch) == 1) {
1517 /* No expression, so step is None */
1518 ch = CHILD(ch, 0);
1519 step = Name(new_identifier("None", c->c_arena), Load,
1520 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521 if (!step)
1522 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001523 } else {
1524 ch = CHILD(ch, 1);
1525 if (TYPE(ch) == test) {
1526 step = ast_for_expr(c, ch);
1527 if (!step)
1528 return NULL;
1529 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530 }
1531 }
1532
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001533 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534}
1535
1536static expr_ty
1537ast_for_binop(struct compiling *c, const node *n)
1538{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 /* Must account for a sequence of expressions.
1540 How should A op B op C by represented?
1541 BinOp(BinOp(A, op, B), op, C).
1542 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 int i, nops;
1545 expr_ty expr1, expr2, result;
1546 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 expr1 = ast_for_expr(c, CHILD(n, 0));
1549 if (!expr1)
1550 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 expr2 = ast_for_expr(c, CHILD(n, 2));
1553 if (!expr2)
1554 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 newoperator = get_operator(CHILD(n, 1));
1557 if (!newoperator)
1558 return NULL;
1559
1560 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1561 c->c_arena);
1562 if (!result)
1563 return NULL;
1564
1565 nops = (NCH(n) - 1) / 2;
1566 for (i = 1; i < nops; i++) {
1567 expr_ty tmp_result, tmp;
1568 const node* next_oper = CHILD(n, i * 2 + 1);
1569
1570 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001571 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 return NULL;
1573
Guido van Rossumd8faa362007-04-27 19:54:29 +00001574 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1575 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576 return NULL;
1577
Guido van Rossumd8faa362007-04-27 19:54:29 +00001578 tmp_result = BinOp(result, newoperator, tmp,
1579 LINENO(next_oper), next_oper->n_col_offset,
1580 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001581 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001582 return NULL;
1583 result = tmp_result;
1584 }
1585 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586}
1587
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001588static expr_ty
1589ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1590{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001591 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1592 subscriptlist: subscript (',' subscript)* [',']
1593 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1594 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001595 REQ(n, trailer);
1596 if (TYPE(CHILD(n, 0)) == LPAR) {
1597 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001598 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1599 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001601 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001602 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001603 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001604 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1605 if (!attr_id)
1606 return NULL;
1607 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001608 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001609 }
1610 else {
1611 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 REQ(CHILD(n, 2), RSQB);
1613 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001615 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1616 if (!slc)
1617 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001618 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1619 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001620 }
1621 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001622 /* The grammar is ambiguous here. The ambiguity is resolved
1623 by treating the sequence as a tuple literal if there are
1624 no slice features.
1625 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001626 int j;
1627 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001629 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001630 asdl_seq *slices, *elts;
1631 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001632 if (!slices)
1633 return NULL;
1634 for (j = 0; j < NCH(n); j += 2) {
1635 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001636 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001639 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001640 asdl_seq_SET(slices, j / 2, slc);
1641 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 if (!simple) {
1643 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001644 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001645 }
1646 /* extract Index values and put them in a Tuple */
1647 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001648 if (!elts)
1649 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001650 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1651 slc = (slice_ty)asdl_seq_GET(slices, j);
1652 assert(slc->kind == Index_kind && slc->v.Index.value);
1653 asdl_seq_SET(elts, j, slc->v.Index.value);
1654 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001656 if (!e)
1657 return NULL;
1658 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001659 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660 }
1661 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001662}
1663
1664static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001665ast_for_factor(struct compiling *c, const node *n)
1666{
1667 node *pfactor, *ppower, *patom, *pnum;
1668 expr_ty expression;
1669
1670 /* If the unary - operator is applied to a constant, don't generate
1671 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1672 constant. The peephole optimizer already does something like
1673 this but it doesn't handle the case where the constant is
1674 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1675 PyLongObject.
1676 */
1677 if (TYPE(CHILD(n, 0)) == MINUS
1678 && NCH(n) == 2
1679 && TYPE((pfactor = CHILD(n, 1))) == factor
1680 && NCH(pfactor) == 1
1681 && TYPE((ppower = CHILD(pfactor, 0))) == power
1682 && NCH(ppower) == 1
1683 && TYPE((patom = CHILD(ppower, 0))) == atom
1684 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1685 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1686 if (s == NULL)
1687 return NULL;
1688 s[0] = '-';
1689 strcpy(s + 1, STR(pnum));
1690 PyObject_FREE(STR(pnum));
1691 STR(pnum) = s;
1692 return ast_for_atom(c, patom);
1693 }
1694
1695 expression = ast_for_expr(c, CHILD(n, 1));
1696 if (!expression)
1697 return NULL;
1698
1699 switch (TYPE(CHILD(n, 0))) {
1700 case PLUS:
1701 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1702 c->c_arena);
1703 case MINUS:
1704 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1705 c->c_arena);
1706 case TILDE:
1707 return UnaryOp(Invert, expression, LINENO(n),
1708 n->n_col_offset, c->c_arena);
1709 }
1710 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1711 TYPE(CHILD(n, 0)));
1712 return NULL;
1713}
1714
1715static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001716ast_for_power(struct compiling *c, const node *n)
1717{
1718 /* power: atom trailer* ('**' factor)*
1719 */
1720 int i;
1721 expr_ty e, tmp;
1722 REQ(n, power);
1723 e = ast_for_atom(c, CHILD(n, 0));
1724 if (!e)
1725 return NULL;
1726 if (NCH(n) == 1)
1727 return e;
1728 for (i = 1; i < NCH(n); i++) {
1729 node *ch = CHILD(n, i);
1730 if (TYPE(ch) != trailer)
1731 break;
1732 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001733 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001734 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001735 tmp->lineno = e->lineno;
1736 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001737 e = tmp;
1738 }
1739 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1740 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001741 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001743 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001744 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001745 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001746 e = tmp;
1747 }
1748 return e;
1749}
1750
Guido van Rossum0368b722007-05-11 16:50:42 +00001751static expr_ty
1752ast_for_starred(struct compiling *c, const node *n)
1753{
1754 expr_ty tmp;
1755 REQ(n, star_expr);
1756
1757 tmp = ast_for_expr(c, CHILD(n, 1));
1758 if (!tmp)
1759 return NULL;
1760
1761 /* The Load context is changed later. */
1762 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1763}
1764
1765
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766/* Do not name a variable 'expr'! Will cause a compile error.
1767*/
1768
1769static expr_ty
1770ast_for_expr(struct compiling *c, const node *n)
1771{
1772 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001773 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001774 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001775 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776 and_test: not_test ('and' not_test)*
1777 not_test: 'not' not_test | comparison
1778 comparison: expr (comp_op expr)*
1779 expr: xor_expr ('|' xor_expr)*
1780 xor_expr: and_expr ('^' and_expr)*
1781 and_expr: shift_expr ('&' shift_expr)*
1782 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1783 arith_expr: term (('+'|'-') term)*
1784 term: factor (('*'|'/'|'%'|'//') factor)*
1785 factor: ('+'|'-'|'~') factor | power
1786 power: atom trailer* ('**' factor)*
1787 */
1788
1789 asdl_seq *seq;
1790 int i;
1791
1792 loop:
1793 switch (TYPE(n)) {
1794 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001795 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001796 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001797 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001799 else if (NCH(n) > 1)
1800 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001801 /* Fallthrough */
1802 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001803 case and_test:
1804 if (NCH(n) == 1) {
1805 n = CHILD(n, 0);
1806 goto loop;
1807 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001808 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809 if (!seq)
1810 return NULL;
1811 for (i = 0; i < NCH(n); i += 2) {
1812 expr_ty e = ast_for_expr(c, CHILD(n, i));
1813 if (!e)
1814 return NULL;
1815 asdl_seq_SET(seq, i / 2, e);
1816 }
1817 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001818 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1819 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001820 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001821 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 case not_test:
1823 if (NCH(n) == 1) {
1824 n = CHILD(n, 0);
1825 goto loop;
1826 }
1827 else {
1828 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1829 if (!expression)
1830 return NULL;
1831
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1833 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 }
1835 case comparison:
1836 if (NCH(n) == 1) {
1837 n = CHILD(n, 0);
1838 goto loop;
1839 }
1840 else {
1841 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001843 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 if (!ops)
1846 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001847 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 return NULL;
1850 }
1851 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001854 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858
1859 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001860 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001864 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 asdl_seq_SET(cmps, i / 2, expression);
1866 }
1867 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001868 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001872 return Compare(expression, ops, cmps, LINENO(n),
1873 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 }
1875 break;
1876
Guido van Rossum0368b722007-05-11 16:50:42 +00001877 case star_expr:
1878 if (TYPE(CHILD(n, 0)) == STAR) {
1879 return ast_for_starred(c, n);
1880 }
1881 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 /* The next five cases all handle BinOps. The main body of code
1883 is the same in each case, but the switch turned inside out to
1884 reuse the code for each type of operator.
1885 */
1886 case expr:
1887 case xor_expr:
1888 case and_expr:
1889 case shift_expr:
1890 case arith_expr:
1891 case term:
1892 if (NCH(n) == 1) {
1893 n = CHILD(n, 0);
1894 goto loop;
1895 }
1896 return ast_for_binop(c, n);
1897 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001898 expr_ty exp = NULL;
1899 if (NCH(n) == 2) {
1900 exp = ast_for_testlist(c, CHILD(n, 1));
1901 if (!exp)
1902 return NULL;
1903 }
1904 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1905 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001906 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 if (NCH(n) == 1) {
1908 n = CHILD(n, 0);
1909 goto loop;
1910 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001912 case power:
1913 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001915 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 return NULL;
1917 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001918 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 return NULL;
1920}
1921
1922static expr_ty
1923ast_for_call(struct compiling *c, const node *n, expr_ty func)
1924{
1925 /*
1926 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1927 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001928 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 */
1930
1931 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001932 asdl_seq *args;
1933 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001934 expr_ty vararg = NULL, kwarg = NULL;
1935
1936 REQ(n, arglist);
1937
1938 nargs = 0;
1939 nkeywords = 0;
1940 ngens = 0;
1941 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001942 node *ch = CHILD(n, i);
1943 if (TYPE(ch) == argument) {
1944 if (NCH(ch) == 1)
1945 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001946 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 nkeywords++;
1950 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 }
1952 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001953 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 "if not sole argument");
1955 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956 }
1957
1958 if (nargs + nkeywords + ngens > 255) {
1959 ast_error(n, "more than 255 arguments");
1960 return NULL;
1961 }
1962
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 return NULL;
1966 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001968 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 nargs = 0;
1970 nkeywords = 0;
1971 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001972 node *ch = CHILD(n, i);
1973 if (TYPE(ch) == argument) {
1974 expr_ty e;
1975 if (NCH(ch) == 1) {
1976 if (nkeywords) {
1977 ast_error(CHILD(ch, 0),
1978 "non-keyword arg after keyword arg");
1979 return NULL;
1980 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001981 if (vararg) {
1982 ast_error(CHILD(ch, 0),
1983 "only named arguments may follow *expression");
1984 return NULL;
1985 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 asdl_seq_SET(args, nargs++, e);
1990 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001991 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001994 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001996 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001997 else {
1998 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001999 identifier key, tmp;
2000 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 /* CHILD(ch, 0) is test, but must be an identifier? */
2003 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 /* f(lambda x: x[0] = 3) ends up getting parsed with
2007 * LHS test = lambda x: x[0], and RHS test = 3.
2008 * SF bug 132313 points out that complaining about a keyword
2009 * then is very confusing.
2010 */
2011 if (e->kind == Lambda_kind) {
2012 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 } else if (e->kind != Name_kind) {
2015 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002016 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002017 } else if (forbidden_name(e, ch)) {
2018 return NULL;
2019 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002020 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002021 for (k = 0; k < nkeywords; k++) {
2022 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2023 if (!PyUnicode_Compare(tmp, key)) {
2024 ast_error(CHILD(ch, 0), "keyword argument repeated");
2025 return NULL;
2026 }
2027 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002033 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 asdl_seq_SET(keywords, nkeywords++, kw);
2035 }
2036 }
2037 else if (TYPE(ch) == STAR) {
2038 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002039 if (!vararg)
2040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 i++;
2042 }
2043 else if (TYPE(ch) == DOUBLESTAR) {
2044 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002045 if (!kwarg)
2046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 i++;
2048 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049 }
2050
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002051 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002057 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002059 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002061 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002063 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002064 }
2065 else {
2066 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002067 TYPE(n) == testlist1);
2068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002070 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 else {
2072 asdl_seq *tmp = seq_for_testlist(c, n);
2073 if (!tmp)
2074 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002077}
2078
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079static stmt_ty
2080ast_for_expr_stmt(struct compiling *c, const node *n)
2081{
2082 REQ(n, expr_stmt);
2083 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2084 | ('=' (yield_expr|testlist))*)
2085 testlist: test (',' test)* [',']
2086 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 test: ... here starts the operator precendence dance
2089 */
2090
2091 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002092 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 if (!e)
2094 return NULL;
2095
Thomas Wouters89f507f2006-12-13 04:49:30 +00002096 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 }
2098 else if (TYPE(CHILD(n, 1)) == augassign) {
2099 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002100 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102
Thomas Wouters89f507f2006-12-13 04:49:30 +00002103 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (!expr1)
2105 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002106 if(!set_context(c, expr1, Store, ch))
2107 return NULL;
Benjamin Peterson4fac7062009-10-03 20:28:47 +00002108 /* set_context checks that most expressions are not the left side.
2109 Augmented assignments can only have a name, a subscript, or an
2110 attribute on the left, though, so we have to explicitly check for
2111 those. */
2112 switch (expr1->kind) {
2113 case Name_kind:
2114 case Attribute_kind:
2115 case Subscript_kind:
2116 break;
2117 default:
2118 ast_error(ch, "illegal expression for augmented assignment");
2119 return NULL;
2120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002121
Thomas Wouters89f507f2006-12-13 04:49:30 +00002122 ch = CHILD(n, 2);
2123 if (TYPE(ch) == testlist)
2124 expr2 = ast_for_testlist(c, ch);
2125 else
2126 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002127 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128 return NULL;
2129
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002130 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002131 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 return NULL;
2133
Thomas Wouters89f507f2006-12-13 04:49:30 +00002134 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 }
2136 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 int i;
2138 asdl_seq *targets;
2139 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 expr_ty expression;
2141
Thomas Wouters89f507f2006-12-13 04:49:30 +00002142 /* a normal assignment */
2143 REQ(CHILD(n, 1), EQUAL);
2144 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2145 if (!targets)
2146 return NULL;
2147 for (i = 0; i < NCH(n) - 2; i += 2) {
2148 expr_ty e;
2149 node *ch = CHILD(n, i);
2150 if (TYPE(ch) == yield_expr) {
2151 ast_error(ch, "assignment to yield expression not possible");
2152 return NULL;
2153 }
2154 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155
Thomas Wouters89f507f2006-12-13 04:49:30 +00002156 /* set context to assign */
2157 if (!e)
2158 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002160 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002161 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 asdl_seq_SET(targets, i / 2, e);
2164 }
2165 value = CHILD(n, NCH(n) - 1);
2166 if (TYPE(value) == testlist)
2167 expression = ast_for_testlist(c, value);
2168 else
2169 expression = ast_for_expr(c, value);
2170 if (!expression)
2171 return NULL;
2172 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174}
2175
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002177ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178{
2179 asdl_seq *seq;
2180 int i;
2181 expr_ty e;
2182
2183 REQ(n, exprlist);
2184
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002185 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002187 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002189 e = ast_for_expr(c, CHILD(n, i));
2190 if (!e)
2191 return NULL;
2192 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002193 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002194 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195 }
2196 return seq;
2197}
2198
2199static stmt_ty
2200ast_for_del_stmt(struct compiling *c, const node *n)
2201{
2202 asdl_seq *expr_list;
2203
2204 /* del_stmt: 'del' exprlist */
2205 REQ(n, del_stmt);
2206
2207 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2208 if (!expr_list)
2209 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002210 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211}
2212
2213static stmt_ty
2214ast_for_flow_stmt(struct compiling *c, const node *n)
2215{
2216 /*
2217 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2218 | yield_stmt
2219 break_stmt: 'break'
2220 continue_stmt: 'continue'
2221 return_stmt: 'return' [testlist]
2222 yield_stmt: yield_expr
2223 yield_expr: 'yield' testlist
2224 raise_stmt: 'raise' [test [',' test [',' test]]]
2225 */
2226 node *ch;
2227
2228 REQ(n, flow_stmt);
2229 ch = CHILD(n, 0);
2230 switch (TYPE(ch)) {
2231 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002234 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002236 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2237 if (!exp)
2238 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002239 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 }
2241 case return_stmt:
2242 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002243 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002245 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 if (!expression)
2247 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002248 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 }
2250 case raise_stmt:
2251 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002252 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2253 else if (NCH(ch) >= 2) {
2254 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2256 if (!expression)
2257 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002258 if (NCH(ch) == 4) {
2259 cause = ast_for_expr(c, CHILD(ch, 3));
2260 if (!cause)
2261 return NULL;
2262 }
2263 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 }
2265 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002266 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 "unexpected flow_stmt: %d", TYPE(ch));
2268 return NULL;
2269 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002270
2271 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2272 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273}
2274
2275static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277{
2278 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002279 import_as_name: NAME ['as' NAME]
2280 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 dotted_name: NAME ('.' NAME)*
2282 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002283 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002284
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 loop:
2286 switch (TYPE(n)) {
2287 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002288 str = NULL;
2289 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002290 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002291 if (!str)
2292 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002293 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002294 name = NEW_IDENTIFIER(CHILD(n, 0));
2295 if (!name)
2296 return NULL;
2297 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 case dotted_as_name:
2299 if (NCH(n) == 1) {
2300 n = CHILD(n, 0);
2301 goto loop;
2302 }
2303 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002304 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002305 if (!a)
2306 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 assert(!a->asname);
2308 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002309 if (!a->asname)
2310 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 return a;
2312 }
2313 break;
2314 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002315 if (NCH(n) == 1) {
2316 name = NEW_IDENTIFIER(CHILD(n, 0));
2317 if (!name)
2318 return NULL;
2319 return alias(name, NULL, c->c_arena);
2320 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 else {
2322 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002323 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002324 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002326 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327
2328 len = 0;
2329 for (i = 0; i < NCH(n); i += 2)
2330 /* length of string plus one for the dot */
2331 len += strlen(STR(CHILD(n, i))) + 1;
2332 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002333 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 if (!str)
2335 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002336 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 if (!s)
2338 return NULL;
2339 for (i = 0; i < NCH(n); i += 2) {
2340 char *sch = STR(CHILD(n, i));
2341 strcpy(s, STR(CHILD(n, i)));
2342 s += strlen(sch);
2343 *s++ = '.';
2344 }
2345 --s;
2346 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002347 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2348 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002349 NULL);
2350 Py_DECREF(str);
2351 if (!uni)
2352 return NULL;
2353 str = uni;
2354 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002355 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002356 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 }
2358 break;
2359 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002360 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002361 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002362 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002364 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 "unexpected import name: %d", TYPE(n));
2366 return NULL;
2367 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002368
2369 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 return NULL;
2371}
2372
2373static stmt_ty
2374ast_for_import_stmt(struct compiling *c, const node *n)
2375{
2376 /*
2377 import_stmt: import_name | import_from
2378 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002379 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2380 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002382 int lineno;
2383 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 int i;
2385 asdl_seq *aliases;
2386
2387 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002388 lineno = LINENO(n);
2389 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002391 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 REQ(n, dotted_as_names);
2394 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2395 if (!aliases)
2396 return NULL;
2397 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002398 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002399 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002401 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002403 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002405 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002407 int idx, ndots = 0;
2408 alias_ty mod = NULL;
2409 identifier modname;
2410
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002411 /* Count the number of dots (for relative imports) and check for the
2412 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002413 for (idx = 1; idx < NCH(n); idx++) {
2414 if (TYPE(CHILD(n, idx)) == dotted_name) {
2415 mod = alias_for_import_name(c, CHILD(n, idx));
2416 idx++;
2417 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002418 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2419 /* three consecutive dots are tokenized as one ELLIPSIS */
2420 ndots += 3;
2421 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 } else if (TYPE(CHILD(n, idx)) != DOT) {
2423 break;
2424 }
2425 ndots++;
2426 }
2427 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002428 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002429 case STAR:
2430 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 n = CHILD(n, idx);
2432 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002433 break;
2434 case LPAR:
2435 /* from ... import (x, y, z) */
2436 n = CHILD(n, idx + 1);
2437 n_children = NCH(n);
2438 break;
2439 case import_as_names:
2440 /* from ... import x, y, z */
2441 n = CHILD(n, idx);
2442 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002443 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444 ast_error(n, "trailing comma not allowed without"
2445 " surrounding parentheses");
2446 return NULL;
2447 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002448 break;
2449 default:
2450 ast_error(n, "Unexpected node-type in from-import");
2451 return NULL;
2452 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2455 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457
2458 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002459 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002460 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002461 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002465 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002467 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2468 if (!import_alias)
2469 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002473 if (mod != NULL)
2474 modname = mod->name;
2475 else
2476 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002477 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002478 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
Neal Norwitz79792652005-11-14 04:25:03 +00002480 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 "unknown import statement: starts with command '%s'",
2482 STR(CHILD(n, 0)));
2483 return NULL;
2484}
2485
2486static stmt_ty
2487ast_for_global_stmt(struct compiling *c, const node *n)
2488{
2489 /* global_stmt: 'global' NAME (',' NAME)* */
2490 identifier name;
2491 asdl_seq *s;
2492 int i;
2493
2494 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002495 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002496 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002499 name = NEW_IDENTIFIER(CHILD(n, i));
2500 if (!name)
2501 return NULL;
2502 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002504 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505}
2506
2507static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002508ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2509{
2510 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2511 identifier name;
2512 asdl_seq *s;
2513 int i;
2514
2515 REQ(n, nonlocal_stmt);
2516 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2517 if (!s)
2518 return NULL;
2519 for (i = 1; i < NCH(n); i += 2) {
2520 name = NEW_IDENTIFIER(CHILD(n, i));
2521 if (!name)
2522 return NULL;
2523 asdl_seq_SET(s, i / 2, name);
2524 }
2525 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2526}
2527
2528static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529ast_for_assert_stmt(struct compiling *c, const node *n)
2530{
2531 /* assert_stmt: 'assert' test [',' test] */
2532 REQ(n, assert_stmt);
2533 if (NCH(n) == 2) {
2534 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2535 if (!expression)
2536 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002537 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538 }
2539 else if (NCH(n) == 4) {
2540 expr_ty expr1, expr2;
2541
2542 expr1 = ast_for_expr(c, CHILD(n, 1));
2543 if (!expr1)
2544 return NULL;
2545 expr2 = ast_for_expr(c, CHILD(n, 3));
2546 if (!expr2)
2547 return NULL;
2548
Thomas Wouters89f507f2006-12-13 04:49:30 +00002549 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 }
Neal Norwitz79792652005-11-14 04:25:03 +00002551 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002552 "improper number of parts to 'assert' statement: %d",
2553 NCH(n));
2554 return NULL;
2555}
2556
2557static asdl_seq *
2558ast_for_suite(struct compiling *c, const node *n)
2559{
2560 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002561 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 stmt_ty s;
2563 int i, total, num, end, pos = 0;
2564 node *ch;
2565
2566 REQ(n, suite);
2567
2568 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002569 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002571 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 n = CHILD(n, 0);
2574 /* simple_stmt always ends with a NEWLINE,
2575 and may have a trailing SEMI
2576 */
2577 end = NCH(n) - 1;
2578 if (TYPE(CHILD(n, end - 1)) == SEMI)
2579 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 for (i = 0; i < end; i += 2) {
2582 ch = CHILD(n, i);
2583 s = ast_for_stmt(c, ch);
2584 if (!s)
2585 return NULL;
2586 asdl_seq_SET(seq, pos++, s);
2587 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 }
2589 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 for (i = 2; i < (NCH(n) - 1); i++) {
2591 ch = CHILD(n, i);
2592 REQ(ch, stmt);
2593 num = num_stmts(ch);
2594 if (num == 1) {
2595 /* small_stmt or compound_stmt with only one child */
2596 s = ast_for_stmt(c, ch);
2597 if (!s)
2598 return NULL;
2599 asdl_seq_SET(seq, pos++, s);
2600 }
2601 else {
2602 int j;
2603 ch = CHILD(ch, 0);
2604 REQ(ch, simple_stmt);
2605 for (j = 0; j < NCH(ch); j += 2) {
2606 /* statement terminates with a semi-colon ';' */
2607 if (NCH(CHILD(ch, j)) == 0) {
2608 assert((j + 1) == NCH(ch));
2609 break;
2610 }
2611 s = ast_for_stmt(c, CHILD(ch, j));
2612 if (!s)
2613 return NULL;
2614 asdl_seq_SET(seq, pos++, s);
2615 }
2616 }
2617 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 }
2619 assert(pos == seq->size);
2620 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621}
2622
2623static stmt_ty
2624ast_for_if_stmt(struct compiling *c, const node *n)
2625{
2626 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2627 ['else' ':' suite]
2628 */
2629 char *s;
2630
2631 REQ(n, if_stmt);
2632
2633 if (NCH(n) == 4) {
2634 expr_ty expression;
2635 asdl_seq *suite_seq;
2636
2637 expression = ast_for_expr(c, CHILD(n, 1));
2638 if (!expression)
2639 return NULL;
2640 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002641 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642 return NULL;
2643
Guido van Rossumd8faa362007-04-27 19:54:29 +00002644 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2645 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002647
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 s = STR(CHILD(n, 4));
2649 /* s[2], the third character in the string, will be
2650 's' for el_s_e, or
2651 'i' for el_i_f
2652 */
2653 if (s[2] == 's') {
2654 expr_ty expression;
2655 asdl_seq *seq1, *seq2;
2656
2657 expression = ast_for_expr(c, CHILD(n, 1));
2658 if (!expression)
2659 return NULL;
2660 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002661 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 return NULL;
2663 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002664 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002665 return NULL;
2666
Guido van Rossumd8faa362007-04-27 19:54:29 +00002667 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2668 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 }
2670 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002672 expr_ty expression;
2673 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002674 asdl_seq *orelse = NULL;
2675 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 /* must reference the child n_elif+1 since 'else' token is third,
2677 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2679 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2680 has_else = 1;
2681 n_elif -= 3;
2682 }
2683 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002686 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002687
Thomas Wouters89f507f2006-12-13 04:49:30 +00002688 orelse = asdl_seq_new(1, c->c_arena);
2689 if (!orelse)
2690 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002692 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002694 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2695 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002697 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2698 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Guido van Rossumd8faa362007-04-27 19:54:29 +00002701 asdl_seq_SET(orelse, 0,
2702 If(expression, suite_seq, suite_seq2,
2703 LINENO(CHILD(n, NCH(n) - 6)),
2704 CHILD(n, NCH(n) - 6)->n_col_offset,
2705 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002706 /* the just-created orelse handled the last elif */
2707 n_elif--;
2708 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709
Thomas Wouters89f507f2006-12-13 04:49:30 +00002710 for (i = 0; i < n_elif; i++) {
2711 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002712 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2713 if (!newobj)
2714 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002716 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002719 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 asdl_seq_SET(newobj, 0,
2723 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002724 LINENO(CHILD(n, off)),
2725 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 orelse = newobj;
2727 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002728 expression = ast_for_expr(c, CHILD(n, 1));
2729 if (!expression)
2730 return NULL;
2731 suite_seq = ast_for_suite(c, CHILD(n, 3));
2732 if (!suite_seq)
2733 return NULL;
2734 return If(expression, suite_seq, orelse,
2735 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002737
2738 PyErr_Format(PyExc_SystemError,
2739 "unexpected token in 'if' statement: %s", s);
2740 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741}
2742
2743static stmt_ty
2744ast_for_while_stmt(struct compiling *c, const node *n)
2745{
2746 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2747 REQ(n, while_stmt);
2748
2749 if (NCH(n) == 4) {
2750 expr_ty expression;
2751 asdl_seq *suite_seq;
2752
2753 expression = ast_for_expr(c, CHILD(n, 1));
2754 if (!expression)
2755 return NULL;
2756 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 }
2761 else if (NCH(n) == 7) {
2762 expr_ty expression;
2763 asdl_seq *seq1, *seq2;
2764
2765 expression = ast_for_expr(c, CHILD(n, 1));
2766 if (!expression)
2767 return NULL;
2768 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002769 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770 return NULL;
2771 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002772 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 return NULL;
2774
Thomas Wouters89f507f2006-12-13 04:49:30 +00002775 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002777
2778 PyErr_Format(PyExc_SystemError,
2779 "wrong number of tokens for 'while' statement: %d",
2780 NCH(n));
2781 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782}
2783
2784static stmt_ty
2785ast_for_for_stmt(struct compiling *c, const node *n)
2786{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002787 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788 expr_ty expression;
2789 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002790 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2792 REQ(n, for_stmt);
2793
2794 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002795 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 if (!seq)
2797 return NULL;
2798 }
2799
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002800 node_target = CHILD(n, 1);
2801 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002802 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002804 /* Check the # of children rather than the length of _target, since
2805 for x, in ... has 1 element in _target, but still requires a Tuple. */
2806 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002807 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002809 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002811 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002812 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813 return NULL;
2814 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002815 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return NULL;
2817
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002818 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2819 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820}
2821
2822static excepthandler_ty
2823ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2824{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002825 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 REQ(exc, except_clause);
2827 REQ(body, suite);
2828
2829 if (NCH(exc) == 1) {
2830 asdl_seq *suite_seq = ast_for_suite(c, body);
2831 if (!suite_seq)
2832 return NULL;
2833
Neal Norwitzad74aa82008-03-31 05:14:30 +00002834 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002835 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836 }
2837 else if (NCH(exc) == 2) {
2838 expr_ty expression;
2839 asdl_seq *suite_seq;
2840
2841 expression = ast_for_expr(c, CHILD(exc, 1));
2842 if (!expression)
2843 return NULL;
2844 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 return NULL;
2847
Neal Norwitzad74aa82008-03-31 05:14:30 +00002848 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002849 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
2851 else if (NCH(exc) == 4) {
2852 asdl_seq *suite_seq;
2853 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002854 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002855 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002858 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 return NULL;
2860 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002861 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862 return NULL;
2863
Neal Norwitzad74aa82008-03-31 05:14:30 +00002864 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002865 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002867
2868 PyErr_Format(PyExc_SystemError,
2869 "wrong number of children for 'except' clause: %d",
2870 NCH(exc));
2871 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872}
2873
2874static stmt_ty
2875ast_for_try_stmt(struct compiling *c, const node *n)
2876{
Neal Norwitzf599f422005-12-17 21:33:47 +00002877 const int nch = NCH(n);
2878 int n_except = (nch - 3)/3;
2879 asdl_seq *body, *orelse = NULL, *finally = NULL;
2880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881 REQ(n, try_stmt);
2882
Neal Norwitzf599f422005-12-17 21:33:47 +00002883 body = ast_for_suite(c, CHILD(n, 2));
2884 if (body == NULL)
2885 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886
Neal Norwitzf599f422005-12-17 21:33:47 +00002887 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2888 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2889 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2890 /* we can assume it's an "else",
2891 because nch >= 9 for try-else-finally and
2892 it would otherwise have a type of except_clause */
2893 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2894 if (orelse == NULL)
2895 return NULL;
2896 n_except--;
2897 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898
Neal Norwitzf599f422005-12-17 21:33:47 +00002899 finally = ast_for_suite(c, CHILD(n, nch - 1));
2900 if (finally == NULL)
2901 return NULL;
2902 n_except--;
2903 }
2904 else {
2905 /* we can assume it's an "else",
2906 otherwise it would have a type of except_clause */
2907 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2908 if (orelse == NULL)
2909 return NULL;
2910 n_except--;
2911 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002913 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002914 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 return NULL;
2916 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002917
2918 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002919 int i;
2920 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002921 /* process except statements to create a try ... except */
2922 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2923 if (handlers == NULL)
2924 return NULL;
2925
2926 for (i = 0; i < n_except; i++) {
2927 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2928 CHILD(n, 5 + i * 3));
2929 if (!e)
2930 return NULL;
2931 asdl_seq_SET(handlers, i, e);
2932 }
2933
Thomas Wouters89f507f2006-12-13 04:49:30 +00002934 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002935 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002936 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002938
2939 /* if a 'finally' is present too, we nest the TryExcept within a
2940 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 body = asdl_seq_new(1, c->c_arena);
2942 if (body == NULL)
2943 return NULL;
2944 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002945 }
2946
2947 /* must be a try ... finally (except clauses are in body, if any exist) */
2948 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002949 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950}
2951
Georg Brandl0c315622009-05-25 21:10:36 +00002952/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002953static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002954ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002955{
2956 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002957
Georg Brandl0c315622009-05-25 21:10:36 +00002958 REQ(n, with_item);
2959 context_expr = ast_for_expr(c, CHILD(n, 0));
2960 if (NCH(n) == 3) {
2961 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002962
2963 if (!optional_vars) {
2964 return NULL;
2965 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002966 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 return NULL;
2968 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002969 }
2970
Georg Brandl0c315622009-05-25 21:10:36 +00002971 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002972 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973}
2974
Georg Brandl0c315622009-05-25 21:10:36 +00002975/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2976static stmt_ty
2977ast_for_with_stmt(struct compiling *c, const node *n)
2978{
2979 int i;
2980 stmt_ty ret;
2981 asdl_seq *inner;
2982
2983 REQ(n, with_stmt);
2984
2985 /* process the with items inside-out */
2986 i = NCH(n) - 1;
2987 /* the suite of the innermost with item is the suite of the with stmt */
2988 inner = ast_for_suite(c, CHILD(n, i));
2989 if (!inner)
2990 return NULL;
2991
2992 for (;;) {
2993 i -= 2;
2994 ret = ast_for_with_item(c, CHILD(n, i), inner);
2995 if (!ret)
2996 return NULL;
2997 /* was this the last item? */
2998 if (i == 1)
2999 break;
3000 /* if not, wrap the result so far in a new sequence */
3001 inner = asdl_seq_new(1, c->c_arena);
3002 if (!inner)
3003 return NULL;
3004 asdl_seq_SET(inner, 0, ret);
3005 }
3006
3007 return ret;
3008}
3009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003011ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003013 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003014 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003015 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003016 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003017
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 REQ(n, classdef);
3019
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003020 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 s = ast_for_suite(c, CHILD(n, 3));
3022 if (!s)
3023 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003024 classname = NEW_IDENTIFIER(CHILD(n, 1));
3025 if (!classname)
3026 return NULL;
3027 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3028 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003030
3031 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003032 s = ast_for_suite(c, CHILD(n,5));
3033 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003034 return NULL;
3035 classname = NEW_IDENTIFIER(CHILD(n, 1));
3036 if (!classname)
3037 return NULL;
3038 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3039 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
3041
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003042 /* class NAME '(' arglist ')' ':' suite */
3043 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003044 {
3045 PyObject *dummy_name;
3046 expr_ty dummy;
3047 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3048 if (!dummy_name)
3049 return NULL;
3050 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3051 call = ast_for_call(c, CHILD(n, 3), dummy);
3052 if (!call)
3053 return NULL;
3054 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003056 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003058 classname = NEW_IDENTIFIER(CHILD(n, 1));
3059 if (!classname)
3060 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003061
Benjamin Peterson30760062008-11-25 04:02:28 +00003062 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003063 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003064 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065}
3066
3067static stmt_ty
3068ast_for_stmt(struct compiling *c, const node *n)
3069{
3070 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003071 assert(NCH(n) == 1);
3072 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 }
3074 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003075 assert(num_stmts(n) == 1);
3076 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 }
3078 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003079 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003080 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3081 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 */
3083 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 case expr_stmt:
3085 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 case del_stmt:
3087 return ast_for_del_stmt(c, n);
3088 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003089 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090 case flow_stmt:
3091 return ast_for_flow_stmt(c, n);
3092 case import_stmt:
3093 return ast_for_import_stmt(c, n);
3094 case global_stmt:
3095 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003096 case nonlocal_stmt:
3097 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098 case assert_stmt:
3099 return ast_for_assert_stmt(c, n);
3100 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003101 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3103 TYPE(n), NCH(n));
3104 return NULL;
3105 }
3106 }
3107 else {
3108 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003109 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003110 */
3111 node *ch = CHILD(n, 0);
3112 REQ(n, compound_stmt);
3113 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case if_stmt:
3115 return ast_for_if_stmt(c, ch);
3116 case while_stmt:
3117 return ast_for_while_stmt(c, ch);
3118 case for_stmt:
3119 return ast_for_for_stmt(c, ch);
3120 case try_stmt:
3121 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003122 case with_stmt:
3123 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003125 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003127 return ast_for_classdef(c, ch, NULL);
3128 case decorated:
3129 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003131 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3133 TYPE(n), NCH(n));
3134 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003135 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003136 }
3137}
3138
3139static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003140parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003142 const char *end;
3143 long x;
3144 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003146 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003147 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148#endif
3149
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003150 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003151 errno = 0;
3152 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003153#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 if (s[0] == '0') {
3157 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3158 if (x < 0 && errno == 0) {
3159 return PyLong_FromString((char *)s,
3160 (char **)0,
3161 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003162 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003163 }
3164 else
3165 x = PyOS_strtol((char *)s, (char **)&end, 0);
3166 if (*end == '\0') {
3167 if (errno != 0)
3168 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003169 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 }
3171 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003174 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003175 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3176 if (compl.imag == -1.0 && PyErr_Occurred())
3177 return NULL;
3178 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003179 }
3180 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003183 dx = PyOS_string_to_double(s, NULL, NULL);
3184 if (dx == -1.0 && PyErr_Occurred())
3185 return NULL;
3186 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188}
3189
3190static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003191decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 PyObject *u, *v;
3194 char *s, *t;
3195 t = s = (char *)*sPtr;
3196 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3197 while (s < end && (*s & 0x80)) s++;
3198 *sPtr = s;
3199 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3200 if (u == NULL)
3201 return NULL;
3202 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3203 Py_DECREF(u);
3204 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205}
3206
3207static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003208decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003210 PyObject *v, *u;
3211 char *buf;
3212 char *p;
3213 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003214
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 if (encoding == NULL) {
3216 buf = (char *)s;
3217 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003219 /* check for integer overflow */
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003220 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003221 return NULL;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003222 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3223 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3224 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225 if (u == NULL)
3226 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003227 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 end = s + len;
3229 while (s < end) {
3230 if (*s == '\\') {
3231 *p++ = *s++;
3232 if (*s & 0x80) {
3233 strcpy(p, "u005c");
3234 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003235 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 }
3237 if (*s & 0x80) { /* XXX inefficient */
3238 PyObject *w;
3239 char *r;
3240 Py_ssize_t rn, i;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003241 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 if (w == NULL) {
3243 Py_DECREF(u);
3244 return NULL;
3245 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003246 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003247 rn = Py_SIZE(w);
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003248 assert(rn % 4 == 0);
3249 for (i = 0; i < rn; i += 4) {
3250 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003251 r[i + 0] & 0xFF,
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003252 r[i + 1] & 0xFF,
3253 r[i + 2] & 0xFF,
3254 r[i + 3] & 0xFF);
3255 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 }
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003257 /* Should be impossible to overflow */
3258 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003259 Py_DECREF(w);
3260 } else {
3261 *p++ = *s++;
3262 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003263 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 len = p - buf;
3265 s = buf;
3266 }
3267 if (rawmode)
3268 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3269 else
3270 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3271 Py_XDECREF(u);
3272 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273}
3274
3275/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003276 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277 * parsestr parses it, and returns the decoded Python string object.
3278 */
3279static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003280parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003281{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003282 size_t len;
3283 const char *s = STR(n);
3284 int quote = Py_CHARMASK(*s);
3285 int rawmode = 0;
3286 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003287 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003288 if (quote == 'b' || quote == 'B') {
3289 quote = *++s;
3290 *bytesmode = 1;
3291 }
3292 if (quote == 'r' || quote == 'R') {
3293 quote = *++s;
3294 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003295 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 }
3297 if (quote != '\'' && quote != '\"') {
3298 PyErr_BadInternalCall();
3299 return NULL;
3300 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003301 s++;
3302 len = strlen(s);
3303 if (len > INT_MAX) {
3304 PyErr_SetString(PyExc_OverflowError,
3305 "string to parse is too long");
3306 return NULL;
3307 }
3308 if (s[--len] != quote) {
3309 PyErr_BadInternalCall();
3310 return NULL;
3311 }
3312 if (len >= 4 && s[0] == quote && s[1] == quote) {
3313 s += 2;
3314 len -= 2;
3315 if (s[--len] != quote || s[--len] != quote) {
3316 PyErr_BadInternalCall();
3317 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003318 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003319 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003320 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003321 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003322 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003323 if (*bytesmode) {
3324 /* Disallow non-ascii characters (but not escapes) */
3325 const char *c;
3326 for (c = s; *c; c++) {
3327 if (Py_CHARMASK(*c) >= 0x80) {
3328 ast_error(n, "bytes can only contain ASCII "
3329 "literal characters.");
3330 return NULL;
3331 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003332 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003333 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003334 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003335 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003336 if (rawmode || strchr(s, '\\') == NULL) {
3337 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003338 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003339 if (u == NULL || !*bytesmode)
3340 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003341 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003342 Py_DECREF(u);
3343 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003344 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003345 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003346 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003347 return PyUnicode_FromStringAndSize(s, len);
3348 } else {
3349 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003350 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003352 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003353 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354}
3355
Guido van Rossum29fd7122007-11-12 01:13:56 +00003356/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003357 * compile-time literal catenation, calling parsestr() on each piece, and
3358 * pasting the intermediate results together.
3359 */
3360static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003361parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003363 PyObject *v;
3364 int i;
3365 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003366 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003367 if (v != NULL) {
3368 /* String literal concatenation */
3369 for (i = 1; i < NCH(n); i++) {
3370 PyObject *s;
3371 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003372 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003373 if (s == NULL)
3374 goto onError;
3375 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003376 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003377 goto onError;
3378 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003379 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3380 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003381 if (v == NULL)
3382 goto onError;
3383 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003384 else {
3385 PyObject *temp = PyUnicode_Concat(v, s);
3386 Py_DECREF(s);
3387 Py_DECREF(v);
3388 v = temp;
3389 if (v == NULL)
3390 goto onError;
3391 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003392 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003393 }
3394 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395
Guido van Rossumd8faa362007-04-27 19:54:29 +00003396 onError:
3397 Py_XDECREF(v);
3398 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399}