blob: 8a1edd2f10077e3bad9d6803b31212ab10b3880a [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
61 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000062 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000063 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
74 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000229 /* PEP 3120 */
230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
360 NULL,
361};
362
363static int
Benjamin Peterson70f52762009-06-28 23:32:44 +0000364forbidden_name(identifier name, const node *n, int full_checks)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365{
Benjamin Peterson78565b22009-06-28 19:19:51 +0000366 assert(PyUnicode_Check(name));
Benjamin Peterson70f52762009-06-28 23:32:44 +0000367 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
368 ast_error(n, "assignment to keyword");
369 return 1;
370 }
371 if (full_checks) {
372 const char **p;
373 for (p = FORBIDDEN; *p; p++) {
374 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
375 ast_error(n, "assignment to keyword");
376 return 1;
377 }
Guido van Rossume7ba4952007-06-06 23:52:48 +0000378 }
379 }
380 return 0;
381}
382
Jeremy Hyltona8293132006-02-28 17:58:27 +0000383/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384
385 Only sets context for expr kinds that "can appear in assignment context"
386 (according to ../Parser/Python.asdl). For other expr kinds, it sets
387 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000388*/
389
390static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000391set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000392{
393 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 /* If a particular expression type can't be used for assign / delete,
395 set expr_name to its name and an error message will be generated.
396 */
397 const char* expr_name = NULL;
398
399 /* The ast defines augmented store and load contexts, but the
400 implementation here doesn't actually use them. The code may be
401 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000402 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000403 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000404 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000405 */
406 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407
408 switch (e->kind) {
409 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000410 e->v.Attribute.ctx = ctx;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000411 if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
412 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Subscript.ctx = ctx;
416 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000417 case Starred_kind:
418 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000419 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 return 0;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000423 if (ctx == Store) {
Benjamin Peterson70f52762009-06-28 23:32:44 +0000424 if (forbidden_name(e->v.Name.id, n, 1))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000425 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 }
427 e->v.Name.ctx = ctx;
428 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000430 e->v.List.ctx = ctx;
431 s = e->v.List.elts;
432 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000434 if (asdl_seq_LEN(e->v.Tuple.elts)) {
435 e->v.Tuple.ctx = ctx;
436 s = e->v.Tuple.elts;
437 }
438 else {
439 expr_name = "()";
440 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 expr_name = "literal";
473 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000474 case Ellipsis_kind:
475 expr_name = "Ellipsis";
476 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000477 case Compare_kind:
478 expr_name = "comparison";
479 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 case IfExp_kind:
481 expr_name = "conditional expression";
482 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000483 default:
484 PyErr_Format(PyExc_SystemError,
485 "unexpected expression in assignment %d (line %d)",
486 e->kind, e->lineno);
487 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000489 /* Check for error string set by switch */
490 if (expr_name) {
491 char buf[300];
492 PyOS_snprintf(buf, sizeof(buf),
493 "can't %s %s",
494 ctx == Store ? "assign to" : "delete",
495 expr_name);
496 return ast_error(n, buf);
497 }
498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000500 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501 */
502 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000503 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504
Thomas Wouters89f507f2006-12-13 04:49:30 +0000505 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000506 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000507 return 0;
508 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 return 1;
511}
512
513static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000514ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515{
516 REQ(n, augassign);
517 n = CHILD(n, 0);
518 switch (STR(n)[0]) {
519 case '+':
520 return Add;
521 case '-':
522 return Sub;
523 case '/':
524 if (STR(n)[1] == '/')
525 return FloorDiv;
526 else
527 return Div;
528 case '%':
529 return Mod;
530 case '<':
531 return LShift;
532 case '>':
533 return RShift;
534 case '&':
535 return BitAnd;
536 case '^':
537 return BitXor;
538 case '|':
539 return BitOr;
540 case '*':
541 if (STR(n)[1] == '*')
542 return Pow;
543 else
544 return Mult;
545 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000546 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 }
549}
550
551static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000552ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000554 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 |'is' 'not'
556 */
557 REQ(n, comp_op);
558 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000559 n = CHILD(n, 0);
560 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561 case LESS:
562 return Lt;
563 case GREATER:
564 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 return Eq;
567 case LESSEQUAL:
568 return LtE;
569 case GREATEREQUAL:
570 return GtE;
571 case NOTEQUAL:
572 return NotEq;
573 case NAME:
574 if (strcmp(STR(n), "in") == 0)
575 return In;
576 if (strcmp(STR(n), "is") == 0)
577 return Is;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
584 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 /* handle "not in" and "is not" */
586 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 case NAME:
588 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
589 return NotIn;
590 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
591 return IsNot;
592 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000593 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597 }
Neal Norwitz79792652005-11-14 04:25:03 +0000598 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000600 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601}
602
603static asdl_seq *
604seq_for_testlist(struct compiling *c, const node *n)
605{
606 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000607 asdl_seq *seq;
608 expr_ty expression;
609 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000610 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000612 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000613 if (!seq)
614 return NULL;
615
616 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000617 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
619 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000620 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622
623 assert(i / 2 < seq->size);
624 asdl_seq_SET(seq, i / 2, expression);
625 }
626 return seq;
627}
628
Neal Norwitzc1505362006-12-28 06:47:50 +0000629static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000630compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000631{
632 identifier name;
633 expr_ty annotation = NULL;
634 node *ch;
635
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000636 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000637 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000638 name = NEW_IDENTIFIER(ch);
639 if (!name)
640 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000641 if (forbidden_name(name, ch, 0))
642 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000643
644 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
645 annotation = ast_for_expr(c, CHILD(n, 2));
646 if (!annotation)
647 return NULL;
648 }
649
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000650 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000651#if 0
652 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
653 if (!set_context(c, result, Store, n))
654 return NULL;
655 return result;
656#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657}
658
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659/* returns -1 if failed to handle keyword only arguments
660 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000661 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000662 ^^^
663 start pointing here
664 */
665static int
666handle_keywordonly_args(struct compiling *c, const node *n, int start,
667 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
668{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000669 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 expr_ty expression, annotation;
672 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 int i = start;
674 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000675
676 if (kwonlyargs == NULL) {
677 ast_error(CHILD(n, start), "named arguments must follow bare *");
678 return -1;
679 }
680 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000681 while (i < NCH(n)) {
682 ch = CHILD(n, i);
683 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000684 case vfpdef:
685 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000686 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000687 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000688 asdl_seq_SET(kwdefaults, j, expression);
689 i += 2; /* '=' and test */
690 }
691 else { /* setting NULL if no default value exists */
692 asdl_seq_SET(kwdefaults, j, NULL);
693 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 if (NCH(ch) == 3) {
695 /* ch is NAME ':' test */
696 annotation = ast_for_expr(c, CHILD(ch, 2));
697 if (!annotation) {
698 ast_error(ch, "expected expression");
699 goto error;
700 }
701 }
702 else {
703 annotation = NULL;
704 }
705 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000706 argname = NEW_IDENTIFIER(ch);
707 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000708 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000709 if (forbidden_name(argname, ch, 0))
710 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000711 arg = arg(argname, annotation, c->c_arena);
712 if (!arg)
713 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000715 i += 2; /* the name and the comma */
716 break;
717 case DOUBLESTAR:
718 return i;
719 default:
720 ast_error(ch, "unexpected node");
721 goto error;
722 }
723 }
724 return i;
725 error:
726 return -1;
727}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728
Jeremy Hyltona8293132006-02-28 17:58:27 +0000729/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000730
731static arguments_ty
732ast_for_arguments(struct compiling *c, const node *n)
733{
Neal Norwitzc1505362006-12-28 06:47:50 +0000734 /* This function handles both typedargslist (function definition)
735 and varargslist (lambda definition).
736
737 parameters: '(' [typedargslist] ')'
738 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000739 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
740 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000741 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000742 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000743 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000744 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
745 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000747 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000749 int i, j, k, nposargs = 0, nkwonlyargs = 0;
750 int nposdefaults = 0, found_default = 0;
751 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000753 arg_ty arg;
754 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 node *ch;
756
757 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000758 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
760 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000763 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000764
Jeremy Hyltone921e022008-07-17 16:37:17 +0000765 /* First count the number of positional args & defaults. The
766 variable i is the loop index for this for loop and the next.
767 The next loop picks up where the first leaves off.
768 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000770 ch = CHILD(n, i);
771 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000772 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000773 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000774 if (i < NCH(n) && /* skip argument following star */
775 (TYPE(CHILD(n, i)) == tfpdef ||
776 TYPE(CHILD(n, i)) == vfpdef)) {
777 i++;
778 }
779 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000780 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000781 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000782 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000785 /* count the number of keyword only args &
786 defaults for keyword only args */
787 for ( ; i < NCH(n); ++i) {
788 ch = CHILD(n, i);
789 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000790 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
793 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000794 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 kwonlyargs = (nkwonlyargs ?
796 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
797 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799 posdefaults = (nposdefaults ?
800 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
801 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000802 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 /* The length of kwonlyargs and kwdefaults are same
804 since we set NULL as default for keyword only argument w/o default
805 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000806 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
808 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810
811 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000812 ast_error(n, "more than 255 arguments");
813 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000815
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000816 /* tfpdef: NAME [':' test]
817 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818 */
819 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000820 j = 0; /* index for defaults */
821 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 ch = CHILD(n, i);
824 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000825 case tfpdef:
826 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
828 anything other than EQUAL or a comma? */
829 /* XXX Should NCH(n) check be made a separate check? */
830 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000831 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
832 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 goto error;
834 assert(posdefaults != NULL);
835 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 else if (found_default) {
840 ast_error(n,
841 "non-default argument follows default argument");
842 goto error;
843 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000844 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 if (!arg)
846 goto error;
847 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 i += 2; /* the name and the comma */
849 break;
850 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000852 ast_error(CHILD(n, i),
853 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000855 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000856 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000857 if (TYPE(ch) == COMMA) {
858 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 i += 2; /* now follows keyword only arguments */
860 res = handle_keywordonly_args(c, n, i,
861 kwonlyargs, kwdefaults);
862 if (res == -1) goto error;
863 i = res; /* res has new position to process */
864 }
865 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000866 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000867 if (!vararg)
868 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000869 if (forbidden_name(vararg, CHILD(ch, 0), 0))
870 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000871 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000872 /* there is an annotation on the vararg */
873 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000875 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000876 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
877 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000878 int res = 0;
879 res = handle_keywordonly_args(c, n, i,
880 kwonlyargs, kwdefaults);
881 if (res == -1) goto error;
882 i = res; /* res has new position to process */
883 }
884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 break;
886 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000887 ch = CHILD(n, i+1); /* tfpdef */
888 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000889 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
890 if (NCH(ch) > 1) {
891 /* there is an annotation on the kwarg */
892 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
893 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000894 if (!kwarg)
895 goto error;
Benjamin Peterson70f52762009-06-28 23:32:44 +0000896 if (forbidden_name(kwarg, CHILD(ch, 0), 0))
897 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 i += 3;
899 break;
900 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000901 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 "unexpected node in varargslist: %d @ %d",
903 TYPE(ch), i);
904 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000905 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000907 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
908 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000910 Py_XDECREF(vararg);
911 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 return NULL;
913}
914
915static expr_ty
916ast_for_dotted_name(struct compiling *c, const node *n)
917{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000918 expr_ty e;
919 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000920 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 int i;
922
923 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000924
925 lineno = LINENO(n);
926 col_offset = n->n_col_offset;
927
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928 id = NEW_IDENTIFIER(CHILD(n, 0));
929 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000930 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000931 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000933 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934
935 for (i = 2; i < NCH(n); i+=2) {
936 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000937 if (!id)
938 return NULL;
939 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
940 if (!e)
941 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 }
943
944 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945}
946
947static expr_ty
948ast_for_decorator(struct compiling *c, const node *n)
949{
950 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
951 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000952 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953
954 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000955 REQ(CHILD(n, 0), AT);
956 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957
958 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
959 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000960 return NULL;
961
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000963 d = name_expr;
964 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965 }
966 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000967 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000968 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000969 if (!d)
970 return NULL;
971 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 }
973 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000974 d = ast_for_call(c, CHILD(n, 3), name_expr);
975 if (!d)
976 return NULL;
977 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978 }
979
980 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981}
982
983static asdl_seq*
984ast_for_decorators(struct compiling *c, const node *n)
985{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000986 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000987 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988 int i;
989
990 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000991 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 if (!decorator_seq)
993 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000996 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 if (!d)
998 return NULL;
999 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001000 }
1001 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002}
1003
1004static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001005ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001006{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001007 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001008 identifier name;
1009 arguments_ty args;
1010 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001011 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001012 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
1014 REQ(n, funcdef);
1015
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016 name = NEW_IDENTIFIER(CHILD(n, name_i));
1017 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00001019 if (forbidden_name(name, CHILD(n, name_i), 0))
1020 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1022 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001023 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001024 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1025 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1026 if (!returns)
1027 return NULL;
1028 name_i += 2;
1029 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030 body = ast_for_suite(c, CHILD(n, name_i + 3));
1031 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001032 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033
Neal Norwitzc1505362006-12-28 06:47:50 +00001034 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036}
1037
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001038static stmt_ty
1039ast_for_decorated(struct compiling *c, const node *n)
1040{
1041 /* decorated: decorators (classdef | funcdef) */
1042 stmt_ty thing = NULL;
1043 asdl_seq *decorator_seq = NULL;
1044
1045 REQ(n, decorated);
1046
1047 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1048 if (!decorator_seq)
1049 return NULL;
1050
1051 assert(TYPE(CHILD(n, 1)) == funcdef ||
1052 TYPE(CHILD(n, 1)) == classdef);
1053
1054 if (TYPE(CHILD(n, 1)) == funcdef) {
1055 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1056 } else if (TYPE(CHILD(n, 1)) == classdef) {
1057 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1058 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001059 /* we count the decorators in when talking about the class' or
1060 * function's line number */
1061 if (thing) {
1062 thing->lineno = LINENO(n);
1063 thing->col_offset = n->n_col_offset;
1064 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001065 return thing;
1066}
1067
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068static expr_ty
1069ast_for_lambdef(struct compiling *c, const node *n)
1070{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001071 /* lambdef: 'lambda' [varargslist] ':' test
1072 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073 arguments_ty args;
1074 expr_ty expression;
1075
1076 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001077 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1078 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079 if (!args)
1080 return NULL;
1081 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001082 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084 }
1085 else {
1086 args = ast_for_arguments(c, CHILD(n, 1));
1087 if (!args)
1088 return NULL;
1089 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001090 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092 }
1093
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001094 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001097static expr_ty
1098ast_for_ifexpr(struct compiling *c, const node *n)
1099{
1100 /* test: or_test 'if' or_test 'else' test */
1101 expr_ty expression, body, orelse;
1102
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001103 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001104 body = ast_for_expr(c, CHILD(n, 0));
1105 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001106 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001107 expression = ast_for_expr(c, CHILD(n, 2));
1108 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001110 orelse = ast_for_expr(c, CHILD(n, 4));
1111 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001112 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1114 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001115}
1116
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001118 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119
Nick Coghlan650f0d02007-04-15 12:05:43 +00001120 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121*/
1122
1123static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001124count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128 count_comp_for:
1129 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001130 REQ(n, comp_for);
1131 if (NCH(n) == 5)
1132 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 else
1134 return n_fors;
1135 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001136 REQ(n, comp_iter);
1137 n = CHILD(n, 0);
1138 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001139 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001140 else if (TYPE(n) == comp_if) {
1141 if (NCH(n) == 3) {
1142 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001144 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001145 else
1146 return n_fors;
1147 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001148
Guido van Rossumd8faa362007-04-27 19:54:29 +00001149 /* Should never be reached */
1150 PyErr_SetString(PyExc_SystemError,
1151 "logic error in count_comp_fors");
1152 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Nick Coghlan650f0d02007-04-15 12:05:43 +00001155/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
Nick Coghlan650f0d02007-04-15 12:05:43 +00001157 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158*/
1159
1160static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001161count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164
Guido van Rossumd8faa362007-04-27 19:54:29 +00001165 while (1) {
1166 REQ(n, comp_iter);
1167 if (TYPE(CHILD(n, 0)) == comp_for)
1168 return n_ifs;
1169 n = CHILD(n, 0);
1170 REQ(n, comp_if);
1171 n_ifs++;
1172 if (NCH(n) == 2)
1173 return n_ifs;
1174 n = CHILD(n, 2);
1175 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176}
1177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178static asdl_seq *
1179ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001182 asdl_seq *comps;
1183
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001184 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 if (n_fors == -1)
1186 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001187
Nick Coghlan650f0d02007-04-15 12:05:43 +00001188 comps = asdl_seq_new(n_fors, c->c_arena);
1189 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001193 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 asdl_seq *t;
1195 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001196 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199
Guido van Rossum992d4a32007-07-11 13:09:30 +00001200 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001201 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001202 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001204 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207
Thomas Wouters89f507f2006-12-13 04:49:30 +00001208 /* Check the # of children rather than the length of t, since
1209 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1210 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001211 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1212 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001214 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001215 c->c_arena),
1216 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217
Nick Coghlan650f0d02007-04-15 12:05:43 +00001218 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001219 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001220
Guido van Rossum992d4a32007-07-11 13:09:30 +00001221 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 int j, n_ifs;
1223 asdl_seq *ifs;
1224
Guido van Rossum992d4a32007-07-11 13:09:30 +00001225 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001226 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001227 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001229
1230 ifs = asdl_seq_new(n_ifs, c->c_arena);
1231 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001233
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001235 REQ(n, comp_iter);
1236 n = CHILD(n, 0);
1237 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238
Guido van Rossum992d4a32007-07-11 13:09:30 +00001239 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001240 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001241 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001242 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001243 if (NCH(n) == 3)
1244 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001246 /* on exit, must guarantee that n is a comp_for */
1247 if (TYPE(n) == comp_iter)
1248 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001249 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001250 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001253 return comps;
1254}
1255
1256static expr_ty
1257ast_for_itercomp(struct compiling *c, const node *n, int type)
1258{
1259 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1260 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1261 expr_ty elt;
1262 asdl_seq *comps;
1263
1264 assert(NCH(n) > 1);
1265
1266 elt = ast_for_expr(c, CHILD(n, 0));
1267 if (!elt)
1268 return NULL;
1269
1270 comps = ast_for_comprehension(c, CHILD(n, 1));
1271 if (!comps)
1272 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001273
1274 if (type == COMP_GENEXP)
1275 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1276 else if (type == COMP_LISTCOMP)
1277 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1278 else if (type == COMP_SETCOMP)
1279 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1280 else
1281 /* Should never happen */
1282 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283}
1284
1285static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286ast_for_dictcomp(struct compiling *c, const node *n)
1287{
1288 expr_ty key, value;
1289 asdl_seq *comps;
1290
1291 assert(NCH(n) > 3);
1292 REQ(CHILD(n, 1), COLON);
1293
1294 key = ast_for_expr(c, CHILD(n, 0));
1295 if (!key)
1296 return NULL;
1297
1298 value = ast_for_expr(c, CHILD(n, 2));
1299 if (!value)
1300 return NULL;
1301
1302 comps = ast_for_comprehension(c, CHILD(n, 3));
1303 if (!comps)
1304 return NULL;
1305
1306 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1307}
1308
1309static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001310ast_for_genexp(struct compiling *c, const node *n)
1311{
1312 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001313 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001314}
1315
1316static expr_ty
1317ast_for_listcomp(struct compiling *c, const node *n)
1318{
1319 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001320 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001321}
1322
1323static expr_ty
1324ast_for_setcomp(struct compiling *c, const node *n)
1325{
1326 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001327 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001328}
1329
1330
1331static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332ast_for_atom(struct compiling *c, const node *n)
1333{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001334 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1335 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001336 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337 */
1338 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001339 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340
1341 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001342 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001343 /* All names start in Load context, but may later be
1344 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001345 PyObject *name = NEW_IDENTIFIER(ch);
1346 if (!name)
1347 return NULL;
1348 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1349 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001351 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001352 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001353 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001354 PyObject *type, *value, *tback, *errstr;
1355 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001356 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001357 if (errstr) {
1358 char *s = "";
1359 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001360 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001361 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1362 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001363 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001364 } else {
1365 ast_error(n, "(unicode error) unknown error");
1366 }
1367 Py_DECREF(type);
1368 Py_DECREF(value);
1369 Py_XDECREF(tback);
1370 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001372 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001373 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001374 if (bytesmode)
1375 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1376 else
1377 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378 }
1379 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001380 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 if (!pynum)
1382 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001383
Thomas Wouters89f507f2006-12-13 04:49:30 +00001384 PyArena_AddPyObject(c->c_arena, pynum);
1385 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 }
Georg Brandldde00282007-03-18 19:01:53 +00001387 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001388 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 ch = CHILD(n, 1);
1391
1392 if (TYPE(ch) == RPAR)
1393 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1394
1395 if (TYPE(ch) == yield_expr)
1396 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001397
1398 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1399 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001400 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001401
Nick Coghlan650f0d02007-04-15 12:05:43 +00001402 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001404 ch = CHILD(n, 1);
1405
1406 if (TYPE(ch) == RSQB)
1407 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1408
Nick Coghlan650f0d02007-04-15 12:05:43 +00001409 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001410 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1411 asdl_seq *elts = seq_for_testlist(c, ch);
1412 if (!elts)
1413 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001414
Thomas Wouters89f507f2006-12-13 04:49:30 +00001415 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1416 }
1417 else
1418 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001420 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1421 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001422 int i, size;
1423 asdl_seq *keys, *values;
1424
1425 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001426 if (TYPE(ch) == RBRACE) {
1427 /* it's an empty dict */
1428 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1429 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1430 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001431 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001432 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001433 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001434 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001435 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 for (i = 0; i < NCH(ch); i += 2) {
1437 expr_ty expression;
1438 expression = ast_for_expr(c, CHILD(ch, i));
1439 if (!expression)
1440 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001441 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001442 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001443 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1444 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1445 /* it's a set comprehension */
1446 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001447 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1448 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001449 } else {
1450 /* it's a dict */
1451 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1452 keys = asdl_seq_new(size, c->c_arena);
1453 if (!keys)
1454 return NULL;
1455
1456 values = asdl_seq_new(size, c->c_arena);
1457 if (!values)
1458 return NULL;
1459
1460 for (i = 0; i < NCH(ch); i += 4) {
1461 expr_ty expression;
1462
1463 expression = ast_for_expr(c, CHILD(ch, i));
1464 if (!expression)
1465 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001466
Guido van Rossum86e58e22006-08-28 15:27:34 +00001467 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001468
Guido van Rossum86e58e22006-08-28 15:27:34 +00001469 expression = ast_for_expr(c, CHILD(ch, i + 2));
1470 if (!expression)
1471 return NULL;
1472
1473 asdl_seq_SET(values, i / 4, expression);
1474 }
1475 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1476 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001479 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1480 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 }
1482}
1483
1484static slice_ty
1485ast_for_slice(struct compiling *c, const node *n)
1486{
1487 node *ch;
1488 expr_ty lower = NULL, upper = NULL, step = NULL;
1489
1490 REQ(n, subscript);
1491
1492 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001493 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494 sliceop: ':' [test]
1495 */
1496 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 if (NCH(n) == 1 && TYPE(ch) == test) {
1498 /* 'step' variable hold no significance in terms of being used over
1499 other vars */
1500 step = ast_for_expr(c, ch);
1501 if (!step)
1502 return NULL;
1503
Thomas Wouters89f507f2006-12-13 04:49:30 +00001504 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505 }
1506
1507 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001508 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!lower)
1510 return NULL;
1511 }
1512
1513 /* If there's an upper bound it's in the second or third position. */
1514 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 if (NCH(n) > 1) {
1516 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Thomas Wouters89f507f2006-12-13 04:49:30 +00001518 if (TYPE(n2) == test) {
1519 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (!upper)
1521 return NULL;
1522 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001523 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001525 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526
Thomas Wouters89f507f2006-12-13 04:49:30 +00001527 if (TYPE(n2) == test) {
1528 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 if (!upper)
1530 return NULL;
1531 }
1532 }
1533
1534 ch = CHILD(n, NCH(n) - 1);
1535 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001536 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001537 ch = CHILD(ch, 1);
1538 if (TYPE(ch) == test) {
1539 step = ast_for_expr(c, ch);
1540 if (!step)
1541 return NULL;
1542 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543 }
1544 }
1545
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001546 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547}
1548
1549static expr_ty
1550ast_for_binop(struct compiling *c, const node *n)
1551{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 /* Must account for a sequence of expressions.
1553 How should A op B op C by represented?
1554 BinOp(BinOp(A, op, B), op, C).
1555 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556
Guido van Rossumd8faa362007-04-27 19:54:29 +00001557 int i, nops;
1558 expr_ty expr1, expr2, result;
1559 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560
Guido van Rossumd8faa362007-04-27 19:54:29 +00001561 expr1 = ast_for_expr(c, CHILD(n, 0));
1562 if (!expr1)
1563 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564
Guido van Rossumd8faa362007-04-27 19:54:29 +00001565 expr2 = ast_for_expr(c, CHILD(n, 2));
1566 if (!expr2)
1567 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 newoperator = get_operator(CHILD(n, 1));
1570 if (!newoperator)
1571 return NULL;
1572
1573 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1574 c->c_arena);
1575 if (!result)
1576 return NULL;
1577
1578 nops = (NCH(n) - 1) / 2;
1579 for (i = 1; i < nops; i++) {
1580 expr_ty tmp_result, tmp;
1581 const node* next_oper = CHILD(n, i * 2 + 1);
1582
1583 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001584 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001585 return NULL;
1586
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1588 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589 return NULL;
1590
Guido van Rossumd8faa362007-04-27 19:54:29 +00001591 tmp_result = BinOp(result, newoperator, tmp,
1592 LINENO(next_oper), next_oper->n_col_offset,
1593 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001594 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001595 return NULL;
1596 result = tmp_result;
1597 }
1598 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599}
1600
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001601static expr_ty
1602ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1603{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001604 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1605 subscriptlist: subscript (',' subscript)* [',']
1606 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1607 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001608 REQ(n, trailer);
1609 if (TYPE(CHILD(n, 0)) == LPAR) {
1610 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001611 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1612 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001613 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001614 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001615 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001616 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001617 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1618 if (!attr_id)
1619 return NULL;
1620 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001621 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001622 }
1623 else {
1624 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625 REQ(CHILD(n, 2), RSQB);
1626 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001628 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1629 if (!slc)
1630 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001631 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1632 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633 }
1634 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001635 /* The grammar is ambiguous here. The ambiguity is resolved
1636 by treating the sequence as a tuple literal if there are
1637 no slice features.
1638 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639 int j;
1640 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001641 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001642 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001643 asdl_seq *slices, *elts;
1644 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001645 if (!slices)
1646 return NULL;
1647 for (j = 0; j < NCH(n); j += 2) {
1648 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001649 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001650 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001651 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001652 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001653 asdl_seq_SET(slices, j / 2, slc);
1654 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001655 if (!simple) {
1656 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001657 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001658 }
1659 /* extract Index values and put them in a Tuple */
1660 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001661 if (!elts)
1662 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001663 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1664 slc = (slice_ty)asdl_seq_GET(slices, j);
1665 assert(slc->kind == Index_kind && slc->v.Index.value);
1666 asdl_seq_SET(elts, j, slc->v.Index.value);
1667 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001668 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001669 if (!e)
1670 return NULL;
1671 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001672 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001673 }
1674 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001675}
1676
1677static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001678ast_for_factor(struct compiling *c, const node *n)
1679{
1680 node *pfactor, *ppower, *patom, *pnum;
1681 expr_ty expression;
1682
1683 /* If the unary - operator is applied to a constant, don't generate
1684 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1685 constant. The peephole optimizer already does something like
1686 this but it doesn't handle the case where the constant is
1687 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1688 PyLongObject.
1689 */
1690 if (TYPE(CHILD(n, 0)) == MINUS
1691 && NCH(n) == 2
1692 && TYPE((pfactor = CHILD(n, 1))) == factor
1693 && NCH(pfactor) == 1
1694 && TYPE((ppower = CHILD(pfactor, 0))) == power
1695 && NCH(ppower) == 1
1696 && TYPE((patom = CHILD(ppower, 0))) == atom
1697 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1698 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1699 if (s == NULL)
1700 return NULL;
1701 s[0] = '-';
1702 strcpy(s + 1, STR(pnum));
1703 PyObject_FREE(STR(pnum));
1704 STR(pnum) = s;
1705 return ast_for_atom(c, patom);
1706 }
1707
1708 expression = ast_for_expr(c, CHILD(n, 1));
1709 if (!expression)
1710 return NULL;
1711
1712 switch (TYPE(CHILD(n, 0))) {
1713 case PLUS:
1714 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1715 c->c_arena);
1716 case MINUS:
1717 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1718 c->c_arena);
1719 case TILDE:
1720 return UnaryOp(Invert, expression, LINENO(n),
1721 n->n_col_offset, c->c_arena);
1722 }
1723 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1724 TYPE(CHILD(n, 0)));
1725 return NULL;
1726}
1727
1728static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001729ast_for_power(struct compiling *c, const node *n)
1730{
1731 /* power: atom trailer* ('**' factor)*
1732 */
1733 int i;
1734 expr_ty e, tmp;
1735 REQ(n, power);
1736 e = ast_for_atom(c, CHILD(n, 0));
1737 if (!e)
1738 return NULL;
1739 if (NCH(n) == 1)
1740 return e;
1741 for (i = 1; i < NCH(n); i++) {
1742 node *ch = CHILD(n, i);
1743 if (TYPE(ch) != trailer)
1744 break;
1745 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001746 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001747 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001748 tmp->lineno = e->lineno;
1749 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001750 e = tmp;
1751 }
1752 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1753 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001754 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001755 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001756 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001757 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001758 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001759 e = tmp;
1760 }
1761 return e;
1762}
1763
Guido van Rossum0368b722007-05-11 16:50:42 +00001764static expr_ty
1765ast_for_starred(struct compiling *c, const node *n)
1766{
1767 expr_ty tmp;
1768 REQ(n, star_expr);
1769
1770 tmp = ast_for_expr(c, CHILD(n, 1));
1771 if (!tmp)
1772 return NULL;
1773
1774 /* The Load context is changed later. */
1775 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1776}
1777
1778
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001779/* Do not name a variable 'expr'! Will cause a compile error.
1780*/
1781
1782static expr_ty
1783ast_for_expr(struct compiling *c, const node *n)
1784{
1785 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001786 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001787 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001788 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001789 and_test: not_test ('and' not_test)*
1790 not_test: 'not' not_test | comparison
1791 comparison: expr (comp_op expr)*
1792 expr: xor_expr ('|' xor_expr)*
1793 xor_expr: and_expr ('^' and_expr)*
1794 and_expr: shift_expr ('&' shift_expr)*
1795 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1796 arith_expr: term (('+'|'-') term)*
1797 term: factor (('*'|'/'|'%'|'//') factor)*
1798 factor: ('+'|'-'|'~') factor | power
1799 power: atom trailer* ('**' factor)*
1800 */
1801
1802 asdl_seq *seq;
1803 int i;
1804
1805 loop:
1806 switch (TYPE(n)) {
1807 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001808 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001809 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001810 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001812 else if (NCH(n) > 1)
1813 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001814 /* Fallthrough */
1815 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 case and_test:
1817 if (NCH(n) == 1) {
1818 n = CHILD(n, 0);
1819 goto loop;
1820 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001821 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 if (!seq)
1823 return NULL;
1824 for (i = 0; i < NCH(n); i += 2) {
1825 expr_ty e = ast_for_expr(c, CHILD(n, i));
1826 if (!e)
1827 return NULL;
1828 asdl_seq_SET(seq, i / 2, e);
1829 }
1830 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001831 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1832 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001833 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001834 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 case not_test:
1836 if (NCH(n) == 1) {
1837 n = CHILD(n, 0);
1838 goto loop;
1839 }
1840 else {
1841 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1842 if (!expression)
1843 return NULL;
1844
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1846 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 }
1848 case comparison:
1849 if (NCH(n) == 1) {
1850 n = CHILD(n, 0);
1851 goto loop;
1852 }
1853 else {
1854 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001856 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 if (!ops)
1859 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001860 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 return NULL;
1863 }
1864 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001867 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001868 if (!newoperator) {
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
1872 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001873 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001874 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001877 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 asdl_seq_SET(cmps, i / 2, expression);
1879 }
1880 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001881 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001885 return Compare(expression, ops, cmps, LINENO(n),
1886 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 }
1888 break;
1889
Guido van Rossum0368b722007-05-11 16:50:42 +00001890 case star_expr:
1891 if (TYPE(CHILD(n, 0)) == STAR) {
1892 return ast_for_starred(c, n);
1893 }
1894 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001895 /* The next five cases all handle BinOps. The main body of code
1896 is the same in each case, but the switch turned inside out to
1897 reuse the code for each type of operator.
1898 */
1899 case expr:
1900 case xor_expr:
1901 case and_expr:
1902 case shift_expr:
1903 case arith_expr:
1904 case term:
1905 if (NCH(n) == 1) {
1906 n = CHILD(n, 0);
1907 goto loop;
1908 }
1909 return ast_for_binop(c, n);
1910 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 expr_ty exp = NULL;
1912 if (NCH(n) == 2) {
1913 exp = ast_for_testlist(c, CHILD(n, 1));
1914 if (!exp)
1915 return NULL;
1916 }
1917 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1918 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001919 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920 if (NCH(n) == 1) {
1921 n = CHILD(n, 0);
1922 goto loop;
1923 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001925 case power:
1926 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001928 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 return NULL;
1930 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001931 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 return NULL;
1933}
1934
1935static expr_ty
1936ast_for_call(struct compiling *c, const node *n, expr_ty func)
1937{
1938 /*
1939 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1940 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001941 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001942 */
1943
1944 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001945 asdl_seq *args;
1946 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947 expr_ty vararg = NULL, kwarg = NULL;
1948
1949 REQ(n, arglist);
1950
1951 nargs = 0;
1952 nkeywords = 0;
1953 ngens = 0;
1954 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001955 node *ch = CHILD(n, i);
1956 if (TYPE(ch) == argument) {
1957 if (NCH(ch) == 1)
1958 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001959 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001960 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001962 nkeywords++;
1963 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 }
1965 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001966 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 "if not sole argument");
1968 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 }
1970
1971 if (nargs + nkeywords + ngens > 255) {
1972 ast_error(n, "more than 255 arguments");
1973 return NULL;
1974 }
1975
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001976 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
1979 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001981 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982 nargs = 0;
1983 nkeywords = 0;
1984 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 node *ch = CHILD(n, i);
1986 if (TYPE(ch) == argument) {
1987 expr_ty e;
1988 if (NCH(ch) == 1) {
1989 if (nkeywords) {
1990 ast_error(CHILD(ch, 0),
1991 "non-keyword arg after keyword arg");
1992 return NULL;
1993 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001994 if (vararg) {
1995 ast_error(CHILD(ch, 0),
1996 "only named arguments may follow *expression");
1997 return NULL;
1998 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002001 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 asdl_seq_SET(args, nargs++, e);
2003 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002004 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002007 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002008 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002010 else {
2011 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002012 identifier key, tmp;
2013 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 /* CHILD(ch, 0) is test, but must be an identifier? */
2016 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002018 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002019 /* f(lambda x: x[0] = 3) ends up getting parsed with
2020 * LHS test = lambda x: x[0], and RHS test = 3.
2021 * SF bug 132313 points out that complaining about a keyword
2022 * then is very confusing.
2023 */
2024 if (e->kind == Lambda_kind) {
2025 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002026 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 } else if (e->kind != Name_kind) {
2028 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002030 } else if (forbidden_name(e->v.Name.id, ch, 1)) {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002031 return NULL;
2032 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002034 for (k = 0; k < nkeywords; k++) {
2035 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2036 if (!PyUnicode_Compare(tmp, key)) {
2037 ast_error(CHILD(ch, 0), "keyword argument repeated");
2038 return NULL;
2039 }
2040 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002043 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 asdl_seq_SET(keywords, nkeywords++, kw);
2048 }
2049 }
2050 else if (TYPE(ch) == STAR) {
2051 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002052 if (!vararg)
2053 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 i++;
2055 }
2056 else if (TYPE(ch) == DOUBLESTAR) {
2057 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002058 if (!kwarg)
2059 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002060 i++;
2061 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 }
2063
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002064 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065}
2066
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002068ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002070 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002071 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002072 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002074 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002075 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002076 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002077 }
2078 else {
2079 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002080 TYPE(n) == testlist1);
2081 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002083 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 else {
2085 asdl_seq *tmp = seq_for_testlist(c, n);
2086 if (!tmp)
2087 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002090}
2091
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092static stmt_ty
2093ast_for_expr_stmt(struct compiling *c, const node *n)
2094{
2095 REQ(n, expr_stmt);
2096 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2097 | ('=' (yield_expr|testlist))*)
2098 testlist: test (',' test)* [',']
2099 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002100 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 test: ... here starts the operator precendence dance
2102 */
2103
2104 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002105 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106 if (!e)
2107 return NULL;
2108
Thomas Wouters89f507f2006-12-13 04:49:30 +00002109 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 }
2111 else if (TYPE(CHILD(n, 1)) == augassign) {
2112 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002113 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002114 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 if (!expr1)
2118 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002119 if(!set_context(c, expr1, Store, ch))
2120 return NULL;
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
Benjamin Peterson78565b22009-06-28 19:19:51 +00002176
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002178ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179{
2180 asdl_seq *seq;
2181 int i;
2182 expr_ty e;
2183
2184 REQ(n, exprlist);
2185
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002186 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002190 e = ast_for_expr(c, CHILD(n, i));
2191 if (!e)
2192 return NULL;
2193 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002194 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 }
2197 return seq;
2198}
2199
2200static stmt_ty
2201ast_for_del_stmt(struct compiling *c, const node *n)
2202{
2203 asdl_seq *expr_list;
2204
2205 /* del_stmt: 'del' exprlist */
2206 REQ(n, del_stmt);
2207
2208 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2209 if (!expr_list)
2210 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002211 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212}
2213
2214static stmt_ty
2215ast_for_flow_stmt(struct compiling *c, const node *n)
2216{
2217 /*
2218 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2219 | yield_stmt
2220 break_stmt: 'break'
2221 continue_stmt: 'continue'
2222 return_stmt: 'return' [testlist]
2223 yield_stmt: yield_expr
2224 yield_expr: 'yield' testlist
2225 raise_stmt: 'raise' [test [',' test [',' test]]]
2226 */
2227 node *ch;
2228
2229 REQ(n, flow_stmt);
2230 ch = CHILD(n, 0);
2231 switch (TYPE(ch)) {
2232 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002235 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002237 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2238 if (!exp)
2239 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002240 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 }
2242 case return_stmt:
2243 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002244 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002246 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247 if (!expression)
2248 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002249 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 }
2251 case raise_stmt:
2252 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002253 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2254 else if (NCH(ch) >= 2) {
2255 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2257 if (!expression)
2258 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002259 if (NCH(ch) == 4) {
2260 cause = ast_for_expr(c, CHILD(ch, 3));
2261 if (!cause)
2262 return NULL;
2263 }
2264 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 }
2266 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002267 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268 "unexpected flow_stmt: %d", TYPE(ch));
2269 return NULL;
2270 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002271
2272 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2273 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274}
2275
2276static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002277alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278{
2279 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002280 import_as_name: NAME ['as' NAME]
2281 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 dotted_name: NAME ('.' NAME)*
2283 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002284 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286 loop:
2287 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002288 case import_as_name: {
2289 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002290 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002291 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002292 if (!name)
2293 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002294 if (NCH(n) == 3) {
2295 node *str_node = CHILD(n, 2);
2296 str = NEW_IDENTIFIER(str_node);
2297 if (!str)
2298 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002299 if (store && forbidden_name(str, str_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002300 return NULL;
2301 }
2302 else {
Benjamin Peterson70f52762009-06-28 23:32:44 +00002303 if (forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002304 return NULL;
2305 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002306 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002307 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 case dotted_as_name:
2309 if (NCH(n) == 1) {
2310 n = CHILD(n, 0);
2311 goto loop;
2312 }
2313 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002314 node *asname_node = CHILD(n, 2);
2315 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002316 if (!a)
2317 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002319 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002320 if (!a->asname)
2321 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002322 if (forbidden_name(a->asname, asname_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002323 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 return a;
2325 }
2326 break;
2327 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002328 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002329 node *name_node = CHILD(n, 0);
2330 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002331 if (!name)
2332 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002333 if (store && forbidden_name(name, name_node, 0))
Benjamin Peterson78565b22009-06-28 19:19:51 +00002334 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002335 return alias(name, NULL, c->c_arena);
2336 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 else {
2338 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002339 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002340 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002342 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343
2344 len = 0;
2345 for (i = 0; i < NCH(n); i += 2)
2346 /* length of string plus one for the dot */
2347 len += strlen(STR(CHILD(n, i))) + 1;
2348 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002349 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350 if (!str)
2351 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002352 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 if (!s)
2354 return NULL;
2355 for (i = 0; i < NCH(n); i += 2) {
2356 char *sch = STR(CHILD(n, i));
2357 strcpy(s, STR(CHILD(n, i)));
2358 s += strlen(sch);
2359 *s++ = '.';
2360 }
2361 --s;
2362 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002363 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2364 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002365 NULL);
2366 Py_DECREF(str);
2367 if (!uni)
2368 return NULL;
2369 str = uni;
2370 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002371 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002372 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 }
2374 break;
2375 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002376 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002378 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002380 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381 "unexpected import name: %d", TYPE(n));
2382 return NULL;
2383 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002384
2385 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 return NULL;
2387}
2388
2389static stmt_ty
2390ast_for_import_stmt(struct compiling *c, const node *n)
2391{
2392 /*
2393 import_stmt: import_name | import_from
2394 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002395 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2396 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002398 int lineno;
2399 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 int i;
2401 asdl_seq *aliases;
2402
2403 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002404 lineno = LINENO(n);
2405 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002406 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002407 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 REQ(n, dotted_as_names);
2410 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2411 if (!aliases)
2412 return NULL;
2413 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002414 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002415 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002421 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 int idx, ndots = 0;
2424 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002425 identifier modname = NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002427 /* Count the number of dots (for relative imports) and check for the
2428 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002429 for (idx = 1; idx < NCH(n); idx++) {
2430 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002431 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2432 if (!mod)
2433 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 idx++;
2435 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002436 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2437 /* three consecutive dots are tokenized as one ELLIPSIS */
2438 ndots += 3;
2439 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 } else if (TYPE(CHILD(n, idx)) != DOT) {
2441 break;
2442 }
2443 ndots++;
2444 }
2445 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002446 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002447 case STAR:
2448 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 n = CHILD(n, idx);
2450 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002451 break;
2452 case LPAR:
2453 /* from ... import (x, y, z) */
2454 n = CHILD(n, idx + 1);
2455 n_children = NCH(n);
2456 break;
2457 case import_as_names:
2458 /* from ... import x, y, z */
2459 n = CHILD(n, idx);
2460 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002461 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 ast_error(n, "trailing comma not allowed without"
2463 " surrounding parentheses");
2464 return NULL;
2465 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002466 break;
2467 default:
2468 ast_error(n, "Unexpected node-type in from-import");
2469 return NULL;
2470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2473 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475
2476 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002477 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002478 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002479 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002483 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002484 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002485 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002486 if (!import_alias)
2487 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002488 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002491 if (mod != NULL)
2492 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002493 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002494 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 }
Neal Norwitz79792652005-11-14 04:25:03 +00002496 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 "unknown import statement: starts with command '%s'",
2498 STR(CHILD(n, 0)));
2499 return NULL;
2500}
2501
2502static stmt_ty
2503ast_for_global_stmt(struct compiling *c, const node *n)
2504{
2505 /* global_stmt: 'global' NAME (',' NAME)* */
2506 identifier name;
2507 asdl_seq *s;
2508 int i;
2509
2510 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002513 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002515 name = NEW_IDENTIFIER(CHILD(n, i));
2516 if (!name)
2517 return NULL;
2518 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002520 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521}
2522
2523static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002524ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2525{
2526 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2527 identifier name;
2528 asdl_seq *s;
2529 int i;
2530
2531 REQ(n, nonlocal_stmt);
2532 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2533 if (!s)
2534 return NULL;
2535 for (i = 1; i < NCH(n); i += 2) {
2536 name = NEW_IDENTIFIER(CHILD(n, i));
2537 if (!name)
2538 return NULL;
2539 asdl_seq_SET(s, i / 2, name);
2540 }
2541 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2542}
2543
2544static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545ast_for_assert_stmt(struct compiling *c, const node *n)
2546{
2547 /* assert_stmt: 'assert' test [',' test] */
2548 REQ(n, assert_stmt);
2549 if (NCH(n) == 2) {
2550 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2551 if (!expression)
2552 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002553 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 }
2555 else if (NCH(n) == 4) {
2556 expr_ty expr1, expr2;
2557
2558 expr1 = ast_for_expr(c, CHILD(n, 1));
2559 if (!expr1)
2560 return NULL;
2561 expr2 = ast_for_expr(c, CHILD(n, 3));
2562 if (!expr2)
2563 return NULL;
2564
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 }
Neal Norwitz79792652005-11-14 04:25:03 +00002567 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002568 "improper number of parts to 'assert' statement: %d",
2569 NCH(n));
2570 return NULL;
2571}
2572
2573static asdl_seq *
2574ast_for_suite(struct compiling *c, const node *n)
2575{
2576 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002577 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 stmt_ty s;
2579 int i, total, num, end, pos = 0;
2580 node *ch;
2581
2582 REQ(n, suite);
2583
2584 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002585 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002587 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 n = CHILD(n, 0);
2590 /* simple_stmt always ends with a NEWLINE,
2591 and may have a trailing SEMI
2592 */
2593 end = NCH(n) - 1;
2594 if (TYPE(CHILD(n, end - 1)) == SEMI)
2595 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 for (i = 0; i < end; i += 2) {
2598 ch = CHILD(n, i);
2599 s = ast_for_stmt(c, ch);
2600 if (!s)
2601 return NULL;
2602 asdl_seq_SET(seq, pos++, s);
2603 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 }
2605 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002606 for (i = 2; i < (NCH(n) - 1); i++) {
2607 ch = CHILD(n, i);
2608 REQ(ch, stmt);
2609 num = num_stmts(ch);
2610 if (num == 1) {
2611 /* small_stmt or compound_stmt with only one child */
2612 s = ast_for_stmt(c, ch);
2613 if (!s)
2614 return NULL;
2615 asdl_seq_SET(seq, pos++, s);
2616 }
2617 else {
2618 int j;
2619 ch = CHILD(ch, 0);
2620 REQ(ch, simple_stmt);
2621 for (j = 0; j < NCH(ch); j += 2) {
2622 /* statement terminates with a semi-colon ';' */
2623 if (NCH(CHILD(ch, j)) == 0) {
2624 assert((j + 1) == NCH(ch));
2625 break;
2626 }
2627 s = ast_for_stmt(c, CHILD(ch, j));
2628 if (!s)
2629 return NULL;
2630 asdl_seq_SET(seq, pos++, s);
2631 }
2632 }
2633 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634 }
2635 assert(pos == seq->size);
2636 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637}
2638
2639static stmt_ty
2640ast_for_if_stmt(struct compiling *c, const node *n)
2641{
2642 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2643 ['else' ':' suite]
2644 */
2645 char *s;
2646
2647 REQ(n, if_stmt);
2648
2649 if (NCH(n) == 4) {
2650 expr_ty expression;
2651 asdl_seq *suite_seq;
2652
2653 expression = ast_for_expr(c, CHILD(n, 1));
2654 if (!expression)
2655 return NULL;
2656 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002657 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658 return NULL;
2659
Guido van Rossumd8faa362007-04-27 19:54:29 +00002660 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2661 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 s = STR(CHILD(n, 4));
2665 /* s[2], the third character in the string, will be
2666 's' for el_s_e, or
2667 'i' for el_i_f
2668 */
2669 if (s[2] == 's') {
2670 expr_ty expression;
2671 asdl_seq *seq1, *seq2;
2672
2673 expression = ast_for_expr(c, CHILD(n, 1));
2674 if (!expression)
2675 return NULL;
2676 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002677 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 return NULL;
2679 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002680 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681 return NULL;
2682
Guido van Rossumd8faa362007-04-27 19:54:29 +00002683 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2684 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 }
2686 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002688 expr_ty expression;
2689 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 asdl_seq *orelse = NULL;
2691 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 /* must reference the child n_elif+1 since 'else' token is third,
2693 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002694 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2695 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2696 has_else = 1;
2697 n_elif -= 3;
2698 }
2699 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Thomas Wouters89f507f2006-12-13 04:49:30 +00002701 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703
Thomas Wouters89f507f2006-12-13 04:49:30 +00002704 orelse = asdl_seq_new(1, c->c_arena);
2705 if (!orelse)
2706 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002708 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002710 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2711 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002713 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2714 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Guido van Rossumd8faa362007-04-27 19:54:29 +00002717 asdl_seq_SET(orelse, 0,
2718 If(expression, suite_seq, suite_seq2,
2719 LINENO(CHILD(n, NCH(n) - 6)),
2720 CHILD(n, NCH(n) - 6)->n_col_offset,
2721 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002722 /* the just-created orelse handled the last elif */
2723 n_elif--;
2724 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725
Thomas Wouters89f507f2006-12-13 04:49:30 +00002726 for (i = 0; i < n_elif; i++) {
2727 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002728 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2729 if (!newobj)
2730 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002735 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002737
Thomas Wouters89f507f2006-12-13 04:49:30 +00002738 asdl_seq_SET(newobj, 0,
2739 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002740 LINENO(CHILD(n, off)),
2741 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002742 orelse = newobj;
2743 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002744 expression = ast_for_expr(c, CHILD(n, 1));
2745 if (!expression)
2746 return NULL;
2747 suite_seq = ast_for_suite(c, CHILD(n, 3));
2748 if (!suite_seq)
2749 return NULL;
2750 return If(expression, suite_seq, orelse,
2751 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753
2754 PyErr_Format(PyExc_SystemError,
2755 "unexpected token in 'if' statement: %s", s);
2756 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757}
2758
2759static stmt_ty
2760ast_for_while_stmt(struct compiling *c, const node *n)
2761{
2762 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2763 REQ(n, while_stmt);
2764
2765 if (NCH(n) == 4) {
2766 expr_ty expression;
2767 asdl_seq *suite_seq;
2768
2769 expression = ast_for_expr(c, CHILD(n, 1));
2770 if (!expression)
2771 return NULL;
2772 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002775 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 }
2777 else if (NCH(n) == 7) {
2778 expr_ty expression;
2779 asdl_seq *seq1, *seq2;
2780
2781 expression = ast_for_expr(c, CHILD(n, 1));
2782 if (!expression)
2783 return NULL;
2784 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
2787 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002788 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789 return NULL;
2790
Thomas Wouters89f507f2006-12-13 04:49:30 +00002791 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002793
2794 PyErr_Format(PyExc_SystemError,
2795 "wrong number of tokens for 'while' statement: %d",
2796 NCH(n));
2797 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798}
2799
2800static stmt_ty
2801ast_for_for_stmt(struct compiling *c, const node *n)
2802{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002803 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 expr_ty expression;
2805 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002806 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2808 REQ(n, for_stmt);
2809
2810 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002811 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 if (!seq)
2813 return NULL;
2814 }
2815
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002816 node_target = CHILD(n, 1);
2817 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002818 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002820 /* Check the # of children rather than the length of _target, since
2821 for x, in ... has 1 element in _target, but still requires a Tuple. */
2822 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002823 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002825 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002827 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002828 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 return NULL;
2830 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002831 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832 return NULL;
2833
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2835 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836}
2837
2838static excepthandler_ty
2839ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2840{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002841 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 REQ(exc, except_clause);
2843 REQ(body, suite);
2844
2845 if (NCH(exc) == 1) {
2846 asdl_seq *suite_seq = ast_for_suite(c, body);
2847 if (!suite_seq)
2848 return NULL;
2849
Neal Norwitzad74aa82008-03-31 05:14:30 +00002850 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002851 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852 }
2853 else if (NCH(exc) == 2) {
2854 expr_ty expression;
2855 asdl_seq *suite_seq;
2856
2857 expression = ast_for_expr(c, CHILD(exc, 1));
2858 if (!expression)
2859 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, NULL, 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 }
2867 else if (NCH(exc) == 4) {
2868 asdl_seq *suite_seq;
2869 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002870 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002871 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00002873 if (forbidden_name(e, CHILD(exc, 3), 0))
2874 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002876 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002877 return NULL;
2878 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002879 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 return NULL;
2881
Neal Norwitzad74aa82008-03-31 05:14:30 +00002882 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002883 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002885
2886 PyErr_Format(PyExc_SystemError,
2887 "wrong number of children for 'except' clause: %d",
2888 NCH(exc));
2889 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890}
2891
2892static stmt_ty
2893ast_for_try_stmt(struct compiling *c, const node *n)
2894{
Neal Norwitzf599f422005-12-17 21:33:47 +00002895 const int nch = NCH(n);
2896 int n_except = (nch - 3)/3;
2897 asdl_seq *body, *orelse = NULL, *finally = NULL;
2898
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 REQ(n, try_stmt);
2900
Neal Norwitzf599f422005-12-17 21:33:47 +00002901 body = ast_for_suite(c, CHILD(n, 2));
2902 if (body == NULL)
2903 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002904
Neal Norwitzf599f422005-12-17 21:33:47 +00002905 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2906 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2907 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2908 /* we can assume it's an "else",
2909 because nch >= 9 for try-else-finally and
2910 it would otherwise have a type of except_clause */
2911 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2912 if (orelse == NULL)
2913 return NULL;
2914 n_except--;
2915 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916
Neal Norwitzf599f422005-12-17 21:33:47 +00002917 finally = ast_for_suite(c, CHILD(n, nch - 1));
2918 if (finally == NULL)
2919 return NULL;
2920 n_except--;
2921 }
2922 else {
2923 /* we can assume it's an "else",
2924 otherwise it would have a type of except_clause */
2925 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2926 if (orelse == NULL)
2927 return NULL;
2928 n_except--;
2929 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002931 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002932 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 return NULL;
2934 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002935
2936 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002937 int i;
2938 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002939 /* process except statements to create a try ... except */
2940 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2941 if (handlers == NULL)
2942 return NULL;
2943
2944 for (i = 0; i < n_except; i++) {
2945 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2946 CHILD(n, 5 + i * 3));
2947 if (!e)
2948 return NULL;
2949 asdl_seq_SET(handlers, i, e);
2950 }
2951
Thomas Wouters89f507f2006-12-13 04:49:30 +00002952 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002953 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002954 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002955 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002956
2957 /* if a 'finally' is present too, we nest the TryExcept within a
2958 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 body = asdl_seq_new(1, c->c_arena);
2960 if (body == NULL)
2961 return NULL;
2962 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002963 }
2964
2965 /* must be a try ... finally (except clauses are in body, if any exist) */
2966 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002967 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968}
2969
Georg Brandl0c315622009-05-25 21:10:36 +00002970/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002971static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002972ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973{
2974 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002975
Georg Brandl0c315622009-05-25 21:10:36 +00002976 REQ(n, with_item);
2977 context_expr = ast_for_expr(c, CHILD(n, 0));
2978 if (NCH(n) == 3) {
2979 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002980
2981 if (!optional_vars) {
2982 return NULL;
2983 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002984 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002985 return NULL;
2986 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002987 }
2988
Georg Brandl0c315622009-05-25 21:10:36 +00002989 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002991}
2992
Georg Brandl0c315622009-05-25 21:10:36 +00002993/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2994static stmt_ty
2995ast_for_with_stmt(struct compiling *c, const node *n)
2996{
2997 int i;
2998 stmt_ty ret;
2999 asdl_seq *inner;
3000
3001 REQ(n, with_stmt);
3002
3003 /* process the with items inside-out */
3004 i = NCH(n) - 1;
3005 /* the suite of the innermost with item is the suite of the with stmt */
3006 inner = ast_for_suite(c, CHILD(n, i));
3007 if (!inner)
3008 return NULL;
3009
3010 for (;;) {
3011 i -= 2;
3012 ret = ast_for_with_item(c, CHILD(n, i), inner);
3013 if (!ret)
3014 return NULL;
3015 /* was this the last item? */
3016 if (i == 1)
3017 break;
3018 /* if not, wrap the result so far in a new sequence */
3019 inner = asdl_seq_new(1, c->c_arena);
3020 if (!inner)
3021 return NULL;
3022 asdl_seq_SET(inner, 0, ret);
3023 }
3024
3025 return ret;
3026}
3027
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003029ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003030{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003032 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003033 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003034 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 REQ(n, classdef);
3037
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003038 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 s = ast_for_suite(c, CHILD(n, 3));
3040 if (!s)
3041 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003042 classname = NEW_IDENTIFIER(CHILD(n, 1));
3043 if (!classname)
3044 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003045 if (forbidden_name(classname, CHILD(n, 3), 0))
3046 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003047 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3048 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003050
3051 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003052 s = ast_for_suite(c, CHILD(n,5));
3053 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003054 return NULL;
3055 classname = NEW_IDENTIFIER(CHILD(n, 1));
3056 if (!classname)
3057 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003058 if (forbidden_name(classname, CHILD(n, 3), 0))
3059 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003060 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3061 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 }
3063
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003064 /* class NAME '(' arglist ')' ':' suite */
3065 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003066 {
3067 PyObject *dummy_name;
3068 expr_ty dummy;
3069 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3070 if (!dummy_name)
3071 return NULL;
3072 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3073 call = ast_for_call(c, CHILD(n, 3), dummy);
3074 if (!call)
3075 return NULL;
3076 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003078 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003080 classname = NEW_IDENTIFIER(CHILD(n, 1));
3081 if (!classname)
3082 return NULL;
Benjamin Peterson70f52762009-06-28 23:32:44 +00003083 if (forbidden_name(classname, CHILD(n, 1), 0))
3084 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003085
Benjamin Peterson30760062008-11-25 04:02:28 +00003086 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003087 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003088 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089}
3090
3091static stmt_ty
3092ast_for_stmt(struct compiling *c, const node *n)
3093{
3094 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003095 assert(NCH(n) == 1);
3096 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 }
3098 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003099 assert(num_stmts(n) == 1);
3100 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 }
3102 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003103 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003104 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3105 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003106 */
3107 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003108 case expr_stmt:
3109 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 case del_stmt:
3111 return ast_for_del_stmt(c, n);
3112 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003113 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114 case flow_stmt:
3115 return ast_for_flow_stmt(c, n);
3116 case import_stmt:
3117 return ast_for_import_stmt(c, n);
3118 case global_stmt:
3119 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003120 case nonlocal_stmt:
3121 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 case assert_stmt:
3123 return ast_for_assert_stmt(c, n);
3124 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003125 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3127 TYPE(n), NCH(n));
3128 return NULL;
3129 }
3130 }
3131 else {
3132 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003133 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003134 */
3135 node *ch = CHILD(n, 0);
3136 REQ(n, compound_stmt);
3137 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138 case if_stmt:
3139 return ast_for_if_stmt(c, ch);
3140 case while_stmt:
3141 return ast_for_while_stmt(c, ch);
3142 case for_stmt:
3143 return ast_for_for_stmt(c, ch);
3144 case try_stmt:
3145 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003146 case with_stmt:
3147 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003149 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003151 return ast_for_classdef(c, ch, NULL);
3152 case decorated:
3153 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003155 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3157 TYPE(n), NCH(n));
3158 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003159 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160 }
3161}
3162
3163static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003164parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003165{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003166 const char *end;
3167 long x;
3168 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003170 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172#endif
3173
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003174 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003175 errno = 0;
3176 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003179#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003180 if (s[0] == '0') {
3181 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3182 if (x < 0 && errno == 0) {
3183 return PyLong_FromString((char *)s,
3184 (char **)0,
3185 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003186 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 }
3188 else
3189 x = PyOS_strtol((char *)s, (char **)&end, 0);
3190 if (*end == '\0') {
3191 if (errno != 0)
3192 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003193 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 }
3195 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003196#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003198 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003199 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3200 if (compl.imag == -1.0 && PyErr_Occurred())
3201 return NULL;
3202 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 }
3204 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003206 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003207 dx = PyOS_string_to_double(s, NULL, NULL);
3208 if (dx == -1.0 && PyErr_Occurred())
3209 return NULL;
3210 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003211 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003212}
3213
3214static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003215decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003217 PyObject *u, *v;
3218 char *s, *t;
3219 t = s = (char *)*sPtr;
3220 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3221 while (s < end && (*s & 0x80)) s++;
3222 *sPtr = s;
3223 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3224 if (u == NULL)
3225 return NULL;
3226 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3227 Py_DECREF(u);
3228 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229}
3230
3231static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003232decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 PyObject *v, *u;
3235 char *buf;
3236 char *p;
3237 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003238
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 if (encoding == NULL) {
3240 buf = (char *)s;
3241 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003243 /* check for integer overflow */
3244 if (len > PY_SIZE_MAX / 4)
3245 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003247 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003248 if (u == NULL)
3249 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003250 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003251 end = s + len;
3252 while (s < end) {
3253 if (*s == '\\') {
3254 *p++ = *s++;
3255 if (*s & 0x80) {
3256 strcpy(p, "u005c");
3257 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003258 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003259 }
3260 if (*s & 0x80) { /* XXX inefficient */
3261 PyObject *w;
3262 char *r;
3263 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003264 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 if (w == NULL) {
3266 Py_DECREF(u);
3267 return NULL;
3268 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003269 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003270 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 assert(rn % 2 == 0);
3272 for (i = 0; i < rn; i += 2) {
3273 sprintf(p, "\\u%02x%02x",
3274 r[i + 0] & 0xFF,
3275 r[i + 1] & 0xFF);
3276 p += 6;
3277 }
3278 Py_DECREF(w);
3279 } else {
3280 *p++ = *s++;
3281 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003282 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003283 len = p - buf;
3284 s = buf;
3285 }
3286 if (rawmode)
3287 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3288 else
3289 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3290 Py_XDECREF(u);
3291 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292}
3293
3294/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003295 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296 * parsestr parses it, and returns the decoded Python string object.
3297 */
3298static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003299parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003301 size_t len;
3302 const char *s = STR(n);
3303 int quote = Py_CHARMASK(*s);
3304 int rawmode = 0;
3305 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003306 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 if (quote == 'b' || quote == 'B') {
3308 quote = *++s;
3309 *bytesmode = 1;
3310 }
3311 if (quote == 'r' || quote == 'R') {
3312 quote = *++s;
3313 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003314 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 }
3316 if (quote != '\'' && quote != '\"') {
3317 PyErr_BadInternalCall();
3318 return NULL;
3319 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003320 s++;
3321 len = strlen(s);
3322 if (len > INT_MAX) {
3323 PyErr_SetString(PyExc_OverflowError,
3324 "string to parse is too long");
3325 return NULL;
3326 }
3327 if (s[--len] != quote) {
3328 PyErr_BadInternalCall();
3329 return NULL;
3330 }
3331 if (len >= 4 && s[0] == quote && s[1] == quote) {
3332 s += 2;
3333 len -= 2;
3334 if (s[--len] != quote || s[--len] != quote) {
3335 PyErr_BadInternalCall();
3336 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003337 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003338 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003339 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003340 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003341 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003342 if (*bytesmode) {
3343 /* Disallow non-ascii characters (but not escapes) */
3344 const char *c;
3345 for (c = s; *c; c++) {
3346 if (Py_CHARMASK(*c) >= 0x80) {
3347 ast_error(n, "bytes can only contain ASCII "
3348 "literal characters.");
3349 return NULL;
3350 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003351 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003352 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003353 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003354 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 if (rawmode || strchr(s, '\\') == NULL) {
3356 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003357 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003358 if (u == NULL || !*bytesmode)
3359 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003360 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003361 Py_DECREF(u);
3362 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003363 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003364 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003365 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003366 return PyUnicode_FromStringAndSize(s, len);
3367 } else {
3368 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003369 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003370 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003371 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003372 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373}
3374
Guido van Rossum29fd7122007-11-12 01:13:56 +00003375/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003376 * compile-time literal catenation, calling parsestr() on each piece, and
3377 * pasting the intermediate results together.
3378 */
3379static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003380parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003382 PyObject *v;
3383 int i;
3384 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003385 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003386 if (v != NULL) {
3387 /* String literal concatenation */
3388 for (i = 1; i < NCH(n); i++) {
3389 PyObject *s;
3390 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003391 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003392 if (s == NULL)
3393 goto onError;
3394 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003395 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003396 goto onError;
3397 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003398 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3399 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003400 if (v == NULL)
3401 goto onError;
3402 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003403 else {
3404 PyObject *temp = PyUnicode_Concat(v, s);
3405 Py_DECREF(s);
3406 Py_DECREF(v);
3407 v = temp;
3408 if (v == NULL)
3409 goto onError;
3410 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003411 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003412 }
3413 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414
Guido van Rossumd8faa362007-04-27 19:54:29 +00003415 onError:
3416 Py_XDECREF(v);
3417 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003418}