blob: 590bc90dabf35f7021d4a6ba1e46dd42e284bf54 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000061 if (*u >= 128) {
62 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
63 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
Martin v. Löwis47383402007-08-15 07:32:56 +000074 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Victor Stinner15244f72010-10-19 01:22:07 +0000105 PyObject *filename_obj;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000106 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 assert(PyErr_Occurred());
109 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000110 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111
112 PyErr_Fetch(&type, &value, &tback);
113 errstr = PyTuple_GetItem(value, 0);
114 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000116 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000117 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000118 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000119 Py_DECREF(errstr);
120 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122 Py_DECREF(value);
123
124 loc = PyErr_ProgramText(filename, lineno);
125 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000126 Py_INCREF(Py_None);
127 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128 }
Victor Stinner15244f72010-10-19 01:22:07 +0000129 if (filename != NULL)
130 filename_obj = PyUnicode_DecodeFSDefault(filename);
131 else {
132 Py_INCREF(Py_None);
133 filename_obj = Py_None;
134 }
135 if (filename_obj != NULL)
136 tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, Py_None, loc);
137 else
138 tmp = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000140 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000141 Py_DECREF(errstr);
142 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000143 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000144 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145 Py_DECREF(errstr);
146 Py_DECREF(tmp);
147 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000148 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149 PyErr_Restore(type, value, tback);
150}
151
152/* num_stmts() returns number of contained statements.
153
154 Use this routine to determine how big a sequence is needed for
155 the statements in a parse tree. Its raison d'etre is this bit of
156 grammar:
157
158 stmt: simple_stmt | compound_stmt
159 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
160
161 A simple_stmt can contain multiple small_stmt elements joined
162 by semicolons. If the arg is a simple_stmt, the number of
163 small_stmt elements is returned.
164*/
165
166static int
167num_stmts(const node *n)
168{
169 int i, l;
170 node *ch;
171
172 switch (TYPE(n)) {
173 case single_input:
174 if (TYPE(CHILD(n, 0)) == NEWLINE)
175 return 0;
176 else
177 return num_stmts(CHILD(n, 0));
178 case file_input:
179 l = 0;
180 for (i = 0; i < NCH(n); i++) {
181 ch = CHILD(n, i);
182 if (TYPE(ch) == stmt)
183 l += num_stmts(ch);
184 }
185 return l;
186 case stmt:
187 return num_stmts(CHILD(n, 0));
188 case compound_stmt:
189 return 1;
190 case simple_stmt:
191 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
192 case suite:
193 if (NCH(n) == 1)
194 return num_stmts(CHILD(n, 0));
195 else {
196 l = 0;
197 for (i = 2; i < (NCH(n) - 1); i++)
198 l += num_stmts(CHILD(n, i));
199 return l;
200 }
201 default: {
202 char buf[128];
203
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000204 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205 TYPE(n), NCH(n));
206 Py_FatalError(buf);
207 }
208 }
209 assert(0);
210 return 0;
211}
212
213/* Transform the CST rooted at node * to the appropriate AST
214*/
215
216mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
218 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000220 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221 asdl_seq *stmts = NULL;
222 stmt_ty s;
223 node *ch;
224 struct compiling c;
225
226 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000227 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000228 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000229#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000230 ast_error(n, "encoding declaration in Unicode string");
231 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000232#endif
233 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 } else if (TYPE(n) == encoding_decl) {
236 c.c_encoding = STR(n);
237 n = CHILD(n, 0);
238 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000239 /* PEP 3120 */
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000240 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000242 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000243 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244
Jeremy Hyltona8293132006-02-28 17:58:27 +0000245 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000246 switch (TYPE(n)) {
247 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000248 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000250 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 for (i = 0; i < NCH(n) - 1; i++) {
252 ch = CHILD(n, i);
253 if (TYPE(ch) == NEWLINE)
254 continue;
255 REQ(ch, stmt);
256 num = num_stmts(ch);
257 if (num == 1) {
258 s = ast_for_stmt(&c, ch);
259 if (!s)
260 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000261 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 }
263 else {
264 ch = CHILD(ch, 0);
265 REQ(ch, simple_stmt);
266 for (j = 0; j < num; j++) {
267 s = ast_for_stmt(&c, CHILD(ch, j * 2));
268 if (!s)
269 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000270 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271 }
272 }
273 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000274 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000275 case eval_input: {
276 expr_ty testlist_ast;
277
Nick Coghlan650f0d02007-04-15 12:05:43 +0000278 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000279 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 if (!testlist_ast)
281 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000282 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 case single_input:
285 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000286 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000288 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
290 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000291 if (!asdl_seq_GET(stmts, 0))
292 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000293 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 }
295 else {
296 n = CHILD(n, 0);
297 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000298 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000300 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000302 s = ast_for_stmt(&c, n);
303 if (!s)
304 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305 asdl_seq_SET(stmts, 0, s);
306 }
307 else {
308 /* Only a simple_stmt can contain multiple statements. */
309 REQ(n, simple_stmt);
310 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 if (TYPE(CHILD(n, i)) == NEWLINE)
312 break;
313 s = ast_for_stmt(&c, CHILD(n, i));
314 if (!s)
315 goto error;
316 asdl_seq_SET(stmts, i / 2, s);
317 }
318 }
319
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000320 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321 }
322 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000323 PyErr_Format(PyExc_SystemError,
324 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 goto error;
326 }
327 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 ast_error_finish(filename);
329 return NULL;
330}
331
332/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
333*/
334
335static operator_ty
336get_operator(const node *n)
337{
338 switch (TYPE(n)) {
339 case VBAR:
340 return BitOr;
341 case CIRCUMFLEX:
342 return BitXor;
343 case AMPER:
344 return BitAnd;
345 case LEFTSHIFT:
346 return LShift;
347 case RIGHTSHIFT:
348 return RShift;
349 case PLUS:
350 return Add;
351 case MINUS:
352 return Sub;
353 case STAR:
354 return Mult;
355 case SLASH:
356 return Div;
357 case DOUBLESLASH:
358 return FloorDiv;
359 case PERCENT:
360 return Mod;
361 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000362 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363 }
364}
365
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366static const char* FORBIDDEN[] = {
367 "None",
368 "True",
369 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000370 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 NULL,
372};
373
374static int
375forbidden_name(expr_ty e, const node *n)
376{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000377 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000378 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000379 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000380 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000381 ast_error(n, "assignment to keyword");
382 return 1;
383 }
384 }
385 return 0;
386}
387
Jeremy Hyltona8293132006-02-28 17:58:27 +0000388/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389
390 Only sets context for expr kinds that "can appear in assignment context"
391 (according to ../Parser/Python.asdl). For other expr kinds, it sets
392 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393*/
394
395static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000396set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397{
398 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 /* If a particular expression type can't be used for assign / delete,
400 set expr_name to its name and an error message will be generated.
401 */
402 const char* expr_name = NULL;
403
404 /* The ast defines augmented store and load contexts, but the
405 implementation here doesn't actually use them. The code may be
406 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000408 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000409 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 */
411 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412
413 switch (e->kind) {
414 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 e->v.Attribute.ctx = ctx;
416 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 e->v.Subscript.ctx = ctx;
419 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000420 case Starred_kind:
421 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000422 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000423 return 0;
424 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000426 if (ctx == Store) {
427 if (forbidden_name(e, n))
428 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 }
430 e->v.Name.ctx = ctx;
431 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 e->v.List.ctx = ctx;
434 s = e->v.List.elts;
435 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case Tuple_kind:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000437 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000439 e->v.Tuple.ctx = ctx;
440 s = e->v.Tuple.elts;
441 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000442 case Lambda_kind:
443 expr_name = "lambda";
444 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000445 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000449 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000450 case UnaryOp_kind:
451 expr_name = "operator";
452 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 expr_name = "generator expression";
455 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456 case Yield_kind:
457 expr_name = "yield expression";
458 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 case ListComp_kind:
460 expr_name = "list comprehension";
461 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000462 case SetComp_kind:
463 expr_name = "set comprehension";
464 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000465 case DictComp_kind:
466 expr_name = "dict comprehension";
467 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000468 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000469 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470 case Num_kind:
471 case Str_kind:
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:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000484 PyErr_Format(PyExc_SystemError,
485 "unexpected expression in assignment %d (line %d)",
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000486 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
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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;
641
642 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
643 annotation = ast_for_expr(c, CHILD(n, 2));
644 if (!annotation)
645 return NULL;
646 }
647
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000648 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000649#if 0
650 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
651 if (!set_context(c, result, Store, n))
652 return NULL;
653 return result;
654#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000655}
656
Guido van Rossum4f72a782006-10-27 23:31:49 +0000657/* returns -1 if failed to handle keyword only arguments
658 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000659 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000660 ^^^
661 start pointing here
662 */
663static int
664handle_keywordonly_args(struct compiling *c, const node *n, int start,
665 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
666{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000667 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000668 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000669 expr_ty expression, annotation;
670 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000671 int i = start;
672 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000673
674 if (kwonlyargs == NULL) {
675 ast_error(CHILD(n, start), "named arguments must follow bare *");
676 return -1;
677 }
678 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679 while (i < NCH(n)) {
680 ch = CHILD(n, i);
681 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000682 case vfpdef:
683 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000684 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000685 expression = ast_for_expr(c, CHILD(n, i + 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000686 if (!expression)
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000687 goto error;
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));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000697 if (!annotation)
Neal Norwitzc1505362006-12-28 06:47:50 +0000698 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000699 }
700 else {
701 annotation = NULL;
702 }
703 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000704 argname = NEW_IDENTIFIER(ch);
705 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000706 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000707 arg = arg(argname, annotation, c->c_arena);
708 if (!arg)
709 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000710 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000711 i += 2; /* the name and the comma */
712 break;
713 case DOUBLESTAR:
714 return i;
715 default:
716 ast_error(ch, "unexpected node");
717 goto error;
718 }
719 }
720 return i;
721 error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000722 return -1;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000723}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000724
Jeremy Hyltona8293132006-02-28 17:58:27 +0000725/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
727static arguments_ty
728ast_for_arguments(struct compiling *c, const node *n)
729{
Neal Norwitzc1505362006-12-28 06:47:50 +0000730 /* This function handles both typedargslist (function definition)
731 and varargslist (lambda definition).
732
733 parameters: '(' [typedargslist] ')'
734 typedargslist: ((tfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000735 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000736 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000738 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 varargslist: ((vfpdef ['=' test] ',')*
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000740 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000741 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000742 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 int i, j, k, nposargs = 0, nkwonlyargs = 0;
746 int nposdefaults = 0, found_default = 0;
747 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000749 arg_ty arg;
750 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 node *ch;
752
753 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000754 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000755 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
756 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000759 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000760
Jeremy Hyltone921e022008-07-17 16:37:17 +0000761 /* First count the number of positional args & defaults. The
762 variable i is the loop index for this for loop and the next.
763 The next loop picks up where the first leaves off.
764 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 ch = CHILD(n, i);
767 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000768 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000769 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000770 if (i < NCH(n) && /* skip argument following star */
771 (TYPE(CHILD(n, i)) == tfpdef ||
772 TYPE(CHILD(n, i)) == vfpdef)) {
773 i++;
774 }
775 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000777 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000778 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000779 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000781 /* count the number of keyword only args &
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 defaults for keyword only args */
783 for ( ; i < NCH(n); ++i) {
784 ch = CHILD(n, i);
785 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000786 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000787 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
789 if (!posargs && nposargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000790 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 kwonlyargs = (nkwonlyargs ?
792 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
793 if (!kwonlyargs && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000794 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000795 posdefaults = (nposdefaults ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
797 if (!posdefaults && nposdefaults)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000798 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000799 /* The length of kwonlyargs and kwdefaults are same
Guido van Rossum4f72a782006-10-27 23:31:49 +0000800 since we set NULL as default for keyword only argument w/o default
801 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000802 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
804 if (!kwdefaults && nkwonlyargs)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000805 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000806
807 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000808 ast_error(n, "more than 255 arguments");
809 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000810 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000812 /* tfpdef: NAME [':' test]
813 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000814 */
815 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000816 j = 0; /* index for defaults */
817 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000819 ch = CHILD(n, i);
820 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000821 case tfpdef:
822 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
824 anything other than EQUAL or a comma? */
825 /* XXX Should NCH(n) check be made a separate check? */
826 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000827 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
828 if (!expression)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000829 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 assert(posdefaults != NULL);
831 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000835 else if (found_default) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000836 ast_error(n,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 "non-default argument follows default argument");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000838 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000840 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 if (!arg)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000842 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844 i += 2; /* the name and the comma */
845 break;
846 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847 if (i+1 >= NCH(n)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000848 ast_error(CHILD(n, i),
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000849 "named arguments must follow bare *");
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000850 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000851 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000852 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000853 if (TYPE(ch) == COMMA) {
854 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000855 i += 2; /* now follows keyword only arguments */
856 res = handle_keywordonly_args(c, n, i,
857 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000858 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 i = res; /* res has new position to process */
860 }
861 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000862 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000863 if (!vararg)
864 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000865 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000866 /* there is an annotation on the vararg */
867 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000868 if (!varargannotation)
869 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000870 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000871 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000872 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
873 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000874 int res = 0;
875 res = handle_keywordonly_args(c, n, i,
876 kwonlyargs, kwdefaults);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000877 if (res == -1) return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000878 i = res; /* res has new position to process */
879 }
880 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 break;
882 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000883 ch = CHILD(n, i+1); /* tfpdef */
884 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000885 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000886 if (!kwarg)
887 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000888 if (NCH(ch) > 1) {
889 /* there is an annotation on the kwarg */
890 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000891 if (!kwargannotation)
892 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000893 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 i += 3;
895 break;
896 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000897 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898 "unexpected node in varargslist: %d @ %d",
899 TYPE(ch), i);
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000900 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000901 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000903 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
904 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000905}
906
907static expr_ty
908ast_for_dotted_name(struct compiling *c, const node *n)
909{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000910 expr_ty e;
911 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000912 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 int i;
914
915 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000916
917 lineno = LINENO(n);
918 col_offset = n->n_col_offset;
919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 id = NEW_IDENTIFIER(CHILD(n, 0));
921 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000922 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000923 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000925 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926
927 for (i = 2; i < NCH(n); i+=2) {
928 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000929 if (!id)
930 return NULL;
931 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
932 if (!e)
933 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000934 }
935
936 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937}
938
939static expr_ty
940ast_for_decorator(struct compiling *c, const node *n)
941{
942 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
943 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000944 expr_ty name_expr;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000947 REQ(CHILD(n, 0), AT);
948 REQ(RCHILD(n, -1), NEWLINE);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000949
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
951 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000953
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955 d = name_expr;
956 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 }
958 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000959 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000960 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000961 if (!d)
962 return NULL;
963 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000964 }
965 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000966 d = ast_for_call(c, CHILD(n, 3), name_expr);
967 if (!d)
968 return NULL;
969 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 }
971
972 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973}
974
975static asdl_seq*
976ast_for_decorators(struct compiling *c, const node *n)
977{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000978 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000979 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 int i;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000981
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000983 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000984 if (!decorator_seq)
985 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000988 d = ast_for_decorator(c, CHILD(n, i));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +0000989 if (!d)
990 return NULL;
991 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992 }
993 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000994}
995
996static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000997ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000999 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +00001000 identifier name;
1001 arguments_ty args;
1002 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +00001003 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001004 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005
1006 REQ(n, funcdef);
1007
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 name = NEW_IDENTIFIER(CHILD(n, name_i));
1009 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1012 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001013 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001014 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1015 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1016 if (!returns)
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00001017 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001018 name_i += 2;
1019 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020 body = ast_for_suite(c, CHILD(n, name_i + 3));
1021 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001022 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023
Neal Norwitzc1505362006-12-28 06:47:50 +00001024 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001025 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001026}
1027
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001028static stmt_ty
1029ast_for_decorated(struct compiling *c, const node *n)
1030{
1031 /* decorated: decorators (classdef | funcdef) */
1032 stmt_ty thing = NULL;
1033 asdl_seq *decorator_seq = NULL;
1034
1035 REQ(n, decorated);
1036
1037 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1038 if (!decorator_seq)
1039 return NULL;
1040
1041 assert(TYPE(CHILD(n, 1)) == funcdef ||
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001042 TYPE(CHILD(n, 1)) == classdef);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001043
1044 if (TYPE(CHILD(n, 1)) == funcdef) {
1045 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1046 } else if (TYPE(CHILD(n, 1)) == classdef) {
1047 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1048 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001049 /* we count the decorators in when talking about the class' or
1050 * function's line number */
1051 if (thing) {
1052 thing->lineno = LINENO(n);
1053 thing->col_offset = n->n_col_offset;
1054 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001055 return thing;
1056}
1057
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058static expr_ty
1059ast_for_lambdef(struct compiling *c, const node *n)
1060{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001061 /* lambdef: 'lambda' [varargslist] ':' test
1062 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 arguments_ty args;
1064 expr_ty expression;
1065
1066 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001067 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1068 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069 if (!args)
1070 return NULL;
1071 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001072 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 }
1075 else {
1076 args = ast_for_arguments(c, CHILD(n, 1));
1077 if (!args)
1078 return NULL;
1079 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001080 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082 }
1083
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001084 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085}
1086
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087static expr_ty
1088ast_for_ifexpr(struct compiling *c, const node *n)
1089{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001090 /* test: or_test 'if' or_test 'else' test */
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001091 expr_ty expression, body, orelse;
1092
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001093 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001094 body = ast_for_expr(c, CHILD(n, 0));
1095 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001096 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001097 expression = ast_for_expr(c, CHILD(n, 2));
1098 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001099 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001100 orelse = ast_for_expr(c, CHILD(n, 4));
1101 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001102 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001103 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1104 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001105}
1106
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001107/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001108 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Nick Coghlan650f0d02007-04-15 12:05:43 +00001110 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001111*/
1112
1113static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001114count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117
Guido van Rossumd8faa362007-04-27 19:54:29 +00001118 count_comp_for:
1119 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001120 REQ(n, comp_for);
1121 if (NCH(n) == 5)
1122 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001123 else
1124 return n_fors;
1125 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001126 REQ(n, comp_iter);
1127 n = CHILD(n, 0);
1128 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001130 else if (TYPE(n) == comp_if) {
1131 if (NCH(n) == 3) {
1132 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001134 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001135 else
1136 return n_fors;
1137 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001138
Guido van Rossumd8faa362007-04-27 19:54:29 +00001139 /* Should never be reached */
1140 PyErr_SetString(PyExc_SystemError,
1141 "logic error in count_comp_fors");
1142 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143}
1144
Nick Coghlan650f0d02007-04-15 12:05:43 +00001145/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148*/
1149
1150static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001151count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001153 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154
Guido van Rossumd8faa362007-04-27 19:54:29 +00001155 while (1) {
1156 REQ(n, comp_iter);
1157 if (TYPE(CHILD(n, 0)) == comp_for)
1158 return n_ifs;
1159 n = CHILD(n, 0);
1160 REQ(n, comp_if);
1161 n_ifs++;
1162 if (NCH(n) == 2)
1163 return n_ifs;
1164 n = CHILD(n, 2);
1165 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166}
1167
Guido van Rossum992d4a32007-07-11 13:09:30 +00001168static asdl_seq *
1169ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001172 asdl_seq *comps;
1173
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001174 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 if (n_fors == -1)
1176 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001177
Nick Coghlan650f0d02007-04-15 12:05:43 +00001178 comps = asdl_seq_new(n_fors, c->c_arena);
1179 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001183 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 asdl_seq *t;
1185 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001186 node *for_ch;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001187
Guido van Rossum992d4a32007-07-11 13:09:30 +00001188 REQ(n, comp_for);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001189
Guido van Rossum992d4a32007-07-11 13:09:30 +00001190 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001191 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001195 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Thomas Wouters89f507f2006-12-13 04:49:30 +00001198 /* Check the # of children rather than the length of t, since
1199 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1200 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1202 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001204 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001205 c->c_arena),
1206 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207
Nick Coghlan650f0d02007-04-15 12:05:43 +00001208 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210
Guido van Rossum992d4a32007-07-11 13:09:30 +00001211 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 int j, n_ifs;
1213 asdl_seq *ifs;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001214
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001216 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001219
1220 ifs = asdl_seq_new(n_ifs, c->c_arena);
1221 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001225 REQ(n, comp_iter);
1226 n = CHILD(n, 0);
1227 REQ(n, comp_if);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001228
Guido van Rossum992d4a32007-07-11 13:09:30 +00001229 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001230 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001231 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001232 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001233 if (NCH(n) == 3)
1234 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001236 /* on exit, must guarantee that n is a comp_for */
1237 if (TYPE(n) == comp_iter)
1238 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001239 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001240 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001241 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001243 return comps;
1244}
1245
1246static expr_ty
1247ast_for_itercomp(struct compiling *c, const node *n, int type)
1248{
1249 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1250 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1251 expr_ty elt;
1252 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001253
Guido van Rossum992d4a32007-07-11 13:09:30 +00001254 assert(NCH(n) > 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001255
Guido van Rossum992d4a32007-07-11 13:09:30 +00001256 elt = ast_for_expr(c, CHILD(n, 0));
1257 if (!elt)
1258 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001259
Guido van Rossum992d4a32007-07-11 13:09:30 +00001260 comps = ast_for_comprehension(c, CHILD(n, 1));
1261 if (!comps)
1262 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001263
1264 if (type == COMP_GENEXP)
1265 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1266 else if (type == COMP_LISTCOMP)
1267 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1268 else if (type == COMP_SETCOMP)
1269 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1270 else
1271 /* Should never happen */
1272 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273}
1274
1275static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001276ast_for_dictcomp(struct compiling *c, const node *n)
1277{
1278 expr_ty key, value;
1279 asdl_seq *comps;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001280
Guido van Rossum992d4a32007-07-11 13:09:30 +00001281 assert(NCH(n) > 3);
1282 REQ(CHILD(n, 1), COLON);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001283
Guido van Rossum992d4a32007-07-11 13:09:30 +00001284 key = ast_for_expr(c, CHILD(n, 0));
1285 if (!key)
1286 return NULL;
1287
1288 value = ast_for_expr(c, CHILD(n, 2));
1289 if (!value)
1290 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001291
Guido van Rossum992d4a32007-07-11 13:09:30 +00001292 comps = ast_for_comprehension(c, CHILD(n, 3));
1293 if (!comps)
1294 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001295
Guido van Rossum992d4a32007-07-11 13:09:30 +00001296 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1297}
1298
1299static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001300ast_for_genexp(struct compiling *c, const node *n)
1301{
1302 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001303 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001304}
1305
1306static expr_ty
1307ast_for_listcomp(struct compiling *c, const node *n)
1308{
1309 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001310 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001311}
1312
1313static expr_ty
1314ast_for_setcomp(struct compiling *c, const node *n)
1315{
1316 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001317 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001318}
1319
1320
1321static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001322ast_for_atom(struct compiling *c, const node *n)
1323{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001324 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1325 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001326 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 */
1328 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001329 int bytesmode = 0;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001330
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001332 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001333 /* All names start in Load context, but may later be
1334 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001335 PyObject *name = NEW_IDENTIFIER(ch);
1336 if (!name)
1337 return NULL;
1338 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1339 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001341 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001342 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001343 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001344 PyObject *type, *value, *tback, *errstr;
1345 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001346 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001347 if (errstr) {
1348 char *s = "";
1349 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001350 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001351 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1352 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001353 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001354 } else {
1355 ast_error(n, "(unicode error) unknown error");
1356 }
1357 Py_DECREF(type);
1358 Py_DECREF(value);
1359 Py_XDECREF(tback);
1360 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001362 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001363 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001364 if (bytesmode)
1365 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1366 else
1367 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368 }
1369 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001370 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 if (!pynum)
1372 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001373
Thomas Wouters89f507f2006-12-13 04:49:30 +00001374 PyArena_AddPyObject(c->c_arena, pynum);
1375 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 }
Georg Brandldde00282007-03-18 19:01:53 +00001377 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001378 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001380 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001381
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 if (TYPE(ch) == RPAR)
1383 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001384
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 if (TYPE(ch) == yield_expr)
1386 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001387
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001388 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
Nick Coghlan650f0d02007-04-15 12:05:43 +00001389 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001390 return ast_for_genexp(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001391
Nick Coghlan650f0d02007-04-15 12:05:43 +00001392 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001394 ch = CHILD(n, 1);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001395
Thomas Wouters89f507f2006-12-13 04:49:30 +00001396 if (TYPE(ch) == RSQB)
1397 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001398
Nick Coghlan650f0d02007-04-15 12:05:43 +00001399 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001400 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1401 asdl_seq *elts = seq_for_testlist(c, ch);
1402 if (!elts)
1403 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001404
Thomas Wouters89f507f2006-12-13 04:49:30 +00001405 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1406 }
1407 else
1408 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001410 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1411 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001412 int i, size;
1413 asdl_seq *keys, *values;
1414
1415 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001416 if (TYPE(ch) == RBRACE) {
1417 /* it's an empty dict */
1418 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1419 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1420 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001421 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001422 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001423 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001424 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001425 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001426 for (i = 0; i < NCH(ch); i += 2) {
1427 expr_ty expression;
1428 expression = ast_for_expr(c, CHILD(ch, i));
1429 if (!expression)
1430 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001431 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001432 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001433 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1434 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1435 /* it's a set comprehension */
1436 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001437 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1438 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001439 } else {
1440 /* it's a dict */
1441 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1442 keys = asdl_seq_new(size, c->c_arena);
1443 if (!keys)
1444 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001445
Guido van Rossum86e58e22006-08-28 15:27:34 +00001446 values = asdl_seq_new(size, c->c_arena);
1447 if (!values)
1448 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001449
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 for (i = 0; i < NCH(ch); i += 4) {
1451 expr_ty expression;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001452
Guido van Rossum86e58e22006-08-28 15:27:34 +00001453 expression = ast_for_expr(c, CHILD(ch, i));
1454 if (!expression)
1455 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001456
Guido van Rossum86e58e22006-08-28 15:27:34 +00001457 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001458
Guido van Rossum86e58e22006-08-28 15:27:34 +00001459 expression = ast_for_expr(c, CHILD(ch, i + 2));
1460 if (!expression)
1461 return NULL;
1462
1463 asdl_seq_SET(values, i / 4, expression);
1464 }
1465 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001469 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1470 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 }
1472}
1473
1474static slice_ty
1475ast_for_slice(struct compiling *c, const node *n)
1476{
1477 node *ch;
1478 expr_ty lower = NULL, upper = NULL, step = NULL;
1479
1480 REQ(n, subscript);
1481
1482 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001483 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 sliceop: ':' [test]
1485 */
1486 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 if (NCH(n) == 1 && TYPE(ch) == test) {
1488 /* 'step' variable hold no significance in terms of being used over
1489 other vars */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001490 step = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 if (!step)
1492 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001493
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 }
1496
1497 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499 if (!lower)
1500 return NULL;
1501 }
1502
1503 /* If there's an upper bound it's in the second or third position. */
1504 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 if (NCH(n) > 1) {
1506 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507
Thomas Wouters89f507f2006-12-13 04:49:30 +00001508 if (TYPE(n2) == test) {
1509 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 if (!upper)
1511 return NULL;
1512 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001513 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001515 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516
Thomas Wouters89f507f2006-12-13 04:49:30 +00001517 if (TYPE(n2) == test) {
1518 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 if (!upper)
1520 return NULL;
1521 }
1522 }
1523
1524 ch = CHILD(n, NCH(n) - 1);
1525 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001526 if (NCH(ch) == 1) {
1527 /* No expression, so step is None */
1528 ch = CHILD(ch, 0);
1529 step = Name(new_identifier("None", c->c_arena), Load,
1530 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531 if (!step)
1532 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001533 } else {
1534 ch = CHILD(ch, 1);
1535 if (TYPE(ch) == test) {
1536 step = ast_for_expr(c, ch);
1537 if (!step)
1538 return NULL;
1539 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540 }
1541 }
1542
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001543 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544}
1545
1546static expr_ty
1547ast_for_binop(struct compiling *c, const node *n)
1548{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001549 /* Must account for a sequence of expressions.
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001550 How should A op B op C by represented?
Guido van Rossumd8faa362007-04-27 19:54:29 +00001551 BinOp(BinOp(A, op, B), op, C).
1552 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553
Guido van Rossumd8faa362007-04-27 19:54:29 +00001554 int i, nops;
1555 expr_ty expr1, expr2, result;
1556 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558 expr1 = ast_for_expr(c, CHILD(n, 0));
1559 if (!expr1)
1560 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 expr2 = ast_for_expr(c, CHILD(n, 2));
1563 if (!expr2)
1564 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001565
Guido van Rossumd8faa362007-04-27 19:54:29 +00001566 newoperator = get_operator(CHILD(n, 1));
1567 if (!newoperator)
1568 return NULL;
1569
1570 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1571 c->c_arena);
1572 if (!result)
1573 return NULL;
1574
1575 nops = (NCH(n) - 1) / 2;
1576 for (i = 1; i < nops; i++) {
1577 expr_ty tmp_result, tmp;
1578 const node* next_oper = CHILD(n, i * 2 + 1);
1579
1580 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001581 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582 return NULL;
1583
Guido van Rossumd8faa362007-04-27 19:54:29 +00001584 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1585 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586 return NULL;
1587
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001588 tmp_result = BinOp(result, newoperator, tmp,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001589 LINENO(next_oper), next_oper->n_col_offset,
1590 c->c_arena);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001591 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001592 return NULL;
1593 result = tmp_result;
1594 }
1595 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596}
1597
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598static expr_ty
1599ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1600{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001601 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001602 subscriptlist: subscript (',' subscript)* [',']
1603 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1604 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001605 REQ(n, trailer);
1606 if (TYPE(CHILD(n, 0)) == LPAR) {
1607 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001608 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1609 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001611 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001613 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001614 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1615 if (!attr_id)
1616 return NULL;
1617 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001618 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001619 }
1620 else {
1621 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001622 REQ(CHILD(n, 2), RSQB);
1623 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001624 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1626 if (!slc)
1627 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001628 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1629 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001630 }
1631 else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001632 /* The grammar is ambiguous here. The ambiguity is resolved
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001633 by treating the sequence as a tuple literal if there are
1634 no slice features.
1635 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001636 int j;
1637 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001639 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001640 asdl_seq *slices, *elts;
1641 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001642 if (!slices)
1643 return NULL;
1644 for (j = 0; j < NCH(n); j += 2) {
1645 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001646 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001647 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001648 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001649 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001650 asdl_seq_SET(slices, j / 2, slc);
1651 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 if (!simple) {
1653 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001654 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001655 }
1656 /* extract Index values and put them in a Tuple */
1657 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001658 if (!elts)
1659 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001660 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1661 slc = (slice_ty)asdl_seq_GET(slices, j);
1662 assert(slc->kind == Index_kind && slc->v.Index.value);
1663 asdl_seq_SET(elts, j, slc->v.Index.value);
1664 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001665 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001666 if (!e)
1667 return NULL;
1668 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001669 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001670 }
1671 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001672}
1673
1674static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001675ast_for_factor(struct compiling *c, const node *n)
1676{
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001677 node *pfactor, *ppower, *patom, *pnum;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001678 expr_ty expression;
1679
Mark Dickinsonce5b6c42010-06-30 10:34:53 +00001680 /* If the unary - operator is applied to a constant, don't generate
1681 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1682 constant. The peephole optimizer already does something like
1683 this but it doesn't handle the case where the constant is
1684 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1685 PyLongObject.
1686 */
1687 if (TYPE(CHILD(n, 0)) == MINUS
1688 && NCH(n) == 2
1689 && TYPE((pfactor = CHILD(n, 1))) == factor
1690 && NCH(pfactor) == 1
1691 && TYPE((ppower = CHILD(pfactor, 0))) == power
1692 && NCH(ppower) == 1
1693 && TYPE((patom = CHILD(ppower, 0))) == atom
1694 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1695 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1696 if (s == NULL)
1697 return NULL;
1698 s[0] = '-';
1699 strcpy(s + 1, STR(pnum));
1700 PyObject_FREE(STR(pnum));
1701 STR(pnum) = s;
1702 return ast_for_atom(c, patom);
1703 }
1704
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001705 expression = ast_for_expr(c, CHILD(n, 1));
1706 if (!expression)
1707 return NULL;
1708
1709 switch (TYPE(CHILD(n, 0))) {
1710 case PLUS:
1711 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1712 c->c_arena);
1713 case MINUS:
1714 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1715 c->c_arena);
1716 case TILDE:
1717 return UnaryOp(Invert, expression, LINENO(n),
1718 n->n_col_offset, c->c_arena);
1719 }
1720 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1721 TYPE(CHILD(n, 0)));
1722 return NULL;
1723}
1724
1725static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001726ast_for_power(struct compiling *c, const node *n)
1727{
1728 /* power: atom trailer* ('**' factor)*
1729 */
1730 int i;
1731 expr_ty e, tmp;
1732 REQ(n, power);
1733 e = ast_for_atom(c, CHILD(n, 0));
1734 if (!e)
1735 return NULL;
1736 if (NCH(n) == 1)
1737 return e;
1738 for (i = 1; i < NCH(n); i++) {
1739 node *ch = CHILD(n, i);
1740 if (TYPE(ch) != trailer)
1741 break;
1742 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001743 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001744 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001745 tmp->lineno = e->lineno;
1746 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001747 e = tmp;
1748 }
1749 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1750 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001751 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001752 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001753 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001754 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001755 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001756 e = tmp;
1757 }
1758 return e;
1759}
1760
Guido van Rossum0368b722007-05-11 16:50:42 +00001761static expr_ty
1762ast_for_starred(struct compiling *c, const node *n)
1763{
1764 expr_ty tmp;
1765 REQ(n, star_expr);
1766
1767 tmp = ast_for_expr(c, CHILD(n, 1));
1768 if (!tmp)
1769 return NULL;
1770
1771 /* The Load context is changed later. */
1772 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1773}
1774
1775
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776/* Do not name a variable 'expr'! Will cause a compile error.
1777*/
1778
1779static expr_ty
1780ast_for_expr(struct compiling *c, const node *n)
1781{
1782 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001783 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001784 test_nocond: or_test | lambdef_nocond
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001785 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 and_test: not_test ('and' not_test)*
1787 not_test: 'not' not_test | comparison
1788 comparison: expr (comp_op expr)*
1789 expr: xor_expr ('|' xor_expr)*
1790 xor_expr: and_expr ('^' and_expr)*
1791 and_expr: shift_expr ('&' shift_expr)*
1792 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1793 arith_expr: term (('+'|'-') term)*
1794 term: factor (('*'|'/'|'%'|'//') factor)*
1795 factor: ('+'|'-'|'~') factor | power
1796 power: atom trailer* ('**' factor)*
1797 */
1798
1799 asdl_seq *seq;
1800 int i;
1801
1802 loop:
1803 switch (TYPE(n)) {
1804 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001805 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001806 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001807 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001809 else if (NCH(n) > 1)
1810 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001811 /* Fallthrough */
1812 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813 case and_test:
1814 if (NCH(n) == 1) {
1815 n = CHILD(n, 0);
1816 goto loop;
1817 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001818 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (!seq)
1820 return NULL;
1821 for (i = 0; i < NCH(n); i += 2) {
1822 expr_ty e = ast_for_expr(c, CHILD(n, i));
1823 if (!e)
1824 return NULL;
1825 asdl_seq_SET(seq, i / 2, e);
1826 }
1827 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001828 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1829 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001830 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001831 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 case not_test:
1833 if (NCH(n) == 1) {
1834 n = CHILD(n, 0);
1835 goto loop;
1836 }
1837 else {
1838 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1839 if (!expression)
1840 return NULL;
1841
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1843 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 }
1845 case comparison:
1846 if (NCH(n) == 1) {
1847 n = CHILD(n, 0);
1848 goto loop;
1849 }
1850 else {
1851 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001853 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001854 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 if (!ops)
1856 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001857 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 return NULL;
1860 }
1861 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001862 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001864 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868
1869 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001870 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001872 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001873
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001874 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 asdl_seq_SET(cmps, i / 2, expression);
1876 }
1877 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001878 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001880 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001881
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001882 return Compare(expression, ops, cmps, LINENO(n),
1883 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 }
1885 break;
1886
Guido van Rossum0368b722007-05-11 16:50:42 +00001887 case star_expr:
1888 if (TYPE(CHILD(n, 0)) == STAR) {
1889 return ast_for_starred(c, n);
1890 }
1891 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 /* The next five cases all handle BinOps. The main body of code
1893 is the same in each case, but the switch turned inside out to
1894 reuse the code for each type of operator.
1895 */
1896 case expr:
1897 case xor_expr:
1898 case and_expr:
1899 case shift_expr:
1900 case arith_expr:
1901 case term:
1902 if (NCH(n) == 1) {
1903 n = CHILD(n, 0);
1904 goto loop;
1905 }
1906 return ast_for_binop(c, n);
1907 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 expr_ty exp = NULL;
1909 if (NCH(n) == 2) {
1910 exp = ast_for_testlist(c, CHILD(n, 1));
1911 if (!exp)
1912 return NULL;
1913 }
1914 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1915 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001916 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917 if (NCH(n) == 1) {
1918 n = CHILD(n, 0);
1919 goto loop;
1920 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001921 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001922 case power:
1923 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001925 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926 return NULL;
1927 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001928 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929 return NULL;
1930}
1931
1932static expr_ty
1933ast_for_call(struct compiling *c, const node *n, expr_ty func)
1934{
1935 /*
1936 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1937 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001938 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939 */
1940
1941 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001942 asdl_seq *args;
1943 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 expr_ty vararg = NULL, kwarg = NULL;
1945
1946 REQ(n, arglist);
1947
1948 nargs = 0;
1949 nkeywords = 0;
1950 ngens = 0;
1951 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001952 node *ch = CHILD(n, i);
1953 if (TYPE(ch) == argument) {
1954 if (NCH(ch) == 1)
1955 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001956 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001957 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001959 nkeywords++;
1960 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 }
1962 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001963 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 "if not sole argument");
1965 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 }
1967
1968 if (nargs + nkeywords + ngens > 255) {
1969 ast_error(n, "more than 255 arguments");
1970 return NULL;
1971 }
1972
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001973 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001975 return NULL;
1976 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 nargs = 0;
1980 nkeywords = 0;
1981 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 node *ch = CHILD(n, i);
1983 if (TYPE(ch) == argument) {
1984 expr_ty e;
1985 if (NCH(ch) == 1) {
1986 if (nkeywords) {
1987 ast_error(CHILD(ch, 0),
1988 "non-keyword arg after keyword arg");
1989 return NULL;
1990 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001991 if (vararg) {
1992 ast_error(CHILD(ch, 0),
1993 "only named arguments may follow *expression");
1994 return NULL;
1995 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001996 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001998 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 asdl_seq_SET(args, nargs++, e);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002000 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002001 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002002 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002004 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002007 else {
2008 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002009 identifier key, tmp;
2010 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002012 /* CHILD(ch, 0) is test, but must be an identifier? */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 /* f(lambda x: x[0] = 3) ends up getting parsed with
2017 * LHS test = lambda x: x[0], and RHS test = 3.
2018 * SF bug 132313 points out that complaining about a keyword
2019 * then is very confusing.
2020 */
2021 if (e->kind == Lambda_kind) {
2022 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002023 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024 } else if (e->kind != Name_kind) {
2025 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002026 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002027 } else if (forbidden_name(e, ch)) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002028 return NULL;
2029 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002031 for (k = 0; k < nkeywords; k++) {
2032 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2033 if (!PyUnicode_Compare(tmp, key)) {
2034 ast_error(CHILD(ch, 0), "keyword argument repeated");
2035 return NULL;
2036 }
2037 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002040 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002041 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002043 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 asdl_seq_SET(keywords, nkeywords++, kw);
2045 }
2046 }
2047 else if (TYPE(ch) == STAR) {
2048 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002049 if (!vararg)
2050 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002051 i++;
2052 }
2053 else if (TYPE(ch) == DOUBLESTAR) {
2054 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002055 if (!kwarg)
2056 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002057 i++;
2058 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059 }
2060
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002061 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062}
2063
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002065ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002067 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002068 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002069 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002071 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002072 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002073 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002074 }
2075 else {
2076 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002077 TYPE(n) == testlist1);
2078 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 else {
2082 asdl_seq *tmp = seq_for_testlist(c, n);
2083 if (!tmp)
2084 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002087}
2088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089static stmt_ty
2090ast_for_expr_stmt(struct compiling *c, const node *n)
2091{
2092 REQ(n, expr_stmt);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002093 /* expr_stmt: testlist (augassign (yield_expr|testlist)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 | ('=' (yield_expr|testlist))*)
2095 testlist: test (',' test)* [',']
2096 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 test: ... here starts the operator precendence dance
2099 */
2100
2101 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002102 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103 if (!e)
2104 return NULL;
2105
Thomas Wouters89f507f2006-12-13 04:49:30 +00002106 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 }
2108 else if (TYPE(CHILD(n, 1)) == augassign) {
2109 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002110 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002111 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Thomas Wouters89f507f2006-12-13 04:49:30 +00002113 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 if (!expr1)
2115 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002116 if(!set_context(c, expr1, Store, ch))
2117 return NULL;
Benjamin Peterson4fac7062009-10-03 20:28:47 +00002118 /* set_context checks that most expressions are not the left side.
2119 Augmented assignments can only have a name, a subscript, or an
2120 attribute on the left, though, so we have to explicitly check for
2121 those. */
2122 switch (expr1->kind) {
2123 case Name_kind:
2124 case Attribute_kind:
2125 case Subscript_kind:
2126 break;
2127 default:
2128 ast_error(ch, "illegal expression for augmented assignment");
2129 return NULL;
2130 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131
Thomas Wouters89f507f2006-12-13 04:49:30 +00002132 ch = CHILD(n, 2);
2133 if (TYPE(ch) == testlist)
2134 expr2 = ast_for_testlist(c, ch);
2135 else
2136 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002137 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138 return NULL;
2139
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002140 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002141 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 return NULL;
2143
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145 }
2146 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002147 int i;
2148 asdl_seq *targets;
2149 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150 expr_ty expression;
2151
Thomas Wouters89f507f2006-12-13 04:49:30 +00002152 /* a normal assignment */
2153 REQ(CHILD(n, 1), EQUAL);
2154 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2155 if (!targets)
2156 return NULL;
2157 for (i = 0; i < NCH(n) - 2; i += 2) {
2158 expr_ty e;
2159 node *ch = CHILD(n, i);
2160 if (TYPE(ch) == yield_expr) {
2161 ast_error(ch, "assignment to yield expression not possible");
2162 return NULL;
2163 }
2164 e = ast_for_testlist(c, ch);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002165 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002166 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002168 /* set context to assign */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002169 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002170 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171
Thomas Wouters89f507f2006-12-13 04:49:30 +00002172 asdl_seq_SET(targets, i / 2, e);
2173 }
2174 value = CHILD(n, NCH(n) - 1);
2175 if (TYPE(value) == testlist)
2176 expression = ast_for_testlist(c, value);
2177 else
2178 expression = ast_for_expr(c, value);
2179 if (!expression)
2180 return NULL;
2181 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183}
2184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002186ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187{
2188 asdl_seq *seq;
2189 int i;
2190 expr_ty e;
2191
2192 REQ(n, exprlist);
2193
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002194 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002196 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002197 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002198 e = ast_for_expr(c, CHILD(n, i));
2199 if (!e)
2200 return NULL;
2201 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002202 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002203 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002204 }
2205 return seq;
2206}
2207
2208static stmt_ty
2209ast_for_del_stmt(struct compiling *c, const node *n)
2210{
2211 asdl_seq *expr_list;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002212
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213 /* del_stmt: 'del' exprlist */
2214 REQ(n, del_stmt);
2215
2216 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2217 if (!expr_list)
2218 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002219 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002220}
2221
2222static stmt_ty
2223ast_for_flow_stmt(struct compiling *c, const node *n)
2224{
2225 /*
2226 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2227 | yield_stmt
2228 break_stmt: 'break'
2229 continue_stmt: 'continue'
2230 return_stmt: 'return' [testlist]
2231 yield_stmt: yield_expr
2232 yield_expr: 'yield' testlist
2233 raise_stmt: 'raise' [test [',' test [',' test]]]
2234 */
2235 node *ch;
2236
2237 REQ(n, flow_stmt);
2238 ch = CHILD(n, 0);
2239 switch (TYPE(ch)) {
2240 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002241 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002243 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002245 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2246 if (!exp)
2247 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002248 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 }
2250 case return_stmt:
2251 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002252 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002254 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255 if (!expression)
2256 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002257 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 }
2259 case raise_stmt:
2260 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002261 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2262 else if (NCH(ch) >= 2) {
2263 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002264 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2265 if (!expression)
2266 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002267 if (NCH(ch) == 4) {
2268 cause = ast_for_expr(c, CHILD(ch, 3));
2269 if (!cause)
2270 return NULL;
2271 }
2272 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002273 }
2274 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002275 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 "unexpected flow_stmt: %d", TYPE(ch));
2277 return NULL;
2278 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002279
2280 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2281 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282}
2283
2284static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002285alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002286{
2287 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002288 import_as_name: NAME ['as' NAME]
2289 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002290 dotted_name: NAME ('.' NAME)*
2291 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002292 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002293
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 loop:
2295 switch (TYPE(n)) {
2296 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002297 str = NULL;
2298 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002299 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002300 if (!str)
2301 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002302 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002303 name = NEW_IDENTIFIER(CHILD(n, 0));
2304 if (!name)
2305 return NULL;
2306 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 case dotted_as_name:
2308 if (NCH(n) == 1) {
2309 n = CHILD(n, 0);
2310 goto loop;
2311 }
2312 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002313 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002314 if (!a)
2315 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002316 assert(!a->asname);
2317 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002318 if (!a->asname)
2319 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 return a;
2321 }
2322 break;
2323 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002324 if (NCH(n) == 1) {
2325 name = NEW_IDENTIFIER(CHILD(n, 0));
2326 if (!name)
2327 return NULL;
2328 return alias(name, NULL, c->c_arena);
2329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002330 else {
2331 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002332 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002333 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 char *s;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002335 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336
2337 len = 0;
2338 for (i = 0; i < NCH(n); i += 2)
2339 /* length of string plus one for the dot */
2340 len += strlen(STR(CHILD(n, i))) + 1;
2341 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002342 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 if (!str)
2344 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002345 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 if (!s)
2347 return NULL;
2348 for (i = 0; i < NCH(n); i += 2) {
2349 char *sch = STR(CHILD(n, i));
2350 strcpy(s, STR(CHILD(n, i)));
2351 s += strlen(sch);
2352 *s++ = '.';
2353 }
2354 --s;
2355 *s = '\0';
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002356 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2357 PyBytes_GET_SIZE(str),
2358 NULL);
2359 Py_DECREF(str);
2360 if (!uni)
2361 return NULL;
2362 str = uni;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002363 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002364 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002365 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 }
2367 break;
2368 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002369 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002370 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002371 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002373 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 "unexpected import name: %d", TYPE(n));
2375 return NULL;
2376 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002377
2378 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002379 return NULL;
2380}
2381
2382static stmt_ty
2383ast_for_import_stmt(struct compiling *c, const node *n)
2384{
2385 /*
2386 import_stmt: import_name | import_from
2387 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002388 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2389 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002391 int lineno;
2392 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393 int i;
2394 asdl_seq *aliases;
2395
2396 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002397 lineno = LINENO(n);
2398 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002400 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 REQ(n, dotted_as_names);
2403 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2404 if (!aliases)
2405 return NULL;
2406 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002407 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002408 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002410 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002414 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 int idx, ndots = 0;
2417 alias_ty mod = NULL;
2418 identifier modname;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002419
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002420 /* Count the number of dots (for relative imports) and check for the
2421 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002422 for (idx = 1; idx < NCH(n); idx++) {
2423 if (TYPE(CHILD(n, idx)) == dotted_name) {
2424 mod = alias_for_import_name(c, CHILD(n, idx));
2425 idx++;
2426 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002427 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002428 /* three consecutive dots are tokenized as one ELLIPSIS */
Georg Brandle66c8c72007-03-19 18:56:50 +00002429 ndots += 3;
2430 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 } else if (TYPE(CHILD(n, idx)) != DOT) {
2432 break;
2433 }
2434 ndots++;
2435 }
2436 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002437 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002438 case STAR:
2439 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 n = CHILD(n, idx);
2441 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002442 break;
2443 case LPAR:
2444 /* from ... import (x, y, z) */
2445 n = CHILD(n, idx + 1);
2446 n_children = NCH(n);
2447 break;
2448 case import_as_names:
2449 /* from ... import x, y, z */
2450 n = CHILD(n, idx);
2451 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002452 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 ast_error(n, "trailing comma not allowed without"
2454 " surrounding parentheses");
2455 return NULL;
2456 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 break;
2458 default:
2459 ast_error(n, "Unexpected node-type in from-import");
2460 return NULL;
2461 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462
Thomas Wouters89f507f2006-12-13 04:49:30 +00002463 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2464 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466
2467 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002468 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002469 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002470 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002472 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002474 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002475 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002476 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2477 if (!import_alias)
2478 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002479 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002480 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002482 if (mod != NULL)
2483 modname = mod->name;
2484 else
2485 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002486 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002487 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 }
Neal Norwitz79792652005-11-14 04:25:03 +00002489 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490 "unknown import statement: starts with command '%s'",
2491 STR(CHILD(n, 0)));
2492 return NULL;
2493}
2494
2495static stmt_ty
2496ast_for_global_stmt(struct compiling *c, const node *n)
2497{
2498 /* global_stmt: 'global' NAME (',' NAME)* */
2499 identifier name;
2500 asdl_seq *s;
2501 int i;
2502
2503 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002504 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002507 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 name = NEW_IDENTIFIER(CHILD(n, i));
2509 if (!name)
2510 return NULL;
2511 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002513 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514}
2515
2516static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002517ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2518{
2519 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2520 identifier name;
2521 asdl_seq *s;
2522 int i;
2523
2524 REQ(n, nonlocal_stmt);
2525 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2526 if (!s)
2527 return NULL;
2528 for (i = 1; i < NCH(n); i += 2) {
2529 name = NEW_IDENTIFIER(CHILD(n, i));
2530 if (!name)
2531 return NULL;
2532 asdl_seq_SET(s, i / 2, name);
2533 }
2534 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2535}
2536
2537static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538ast_for_assert_stmt(struct compiling *c, const node *n)
2539{
2540 /* assert_stmt: 'assert' test [',' test] */
2541 REQ(n, assert_stmt);
2542 if (NCH(n) == 2) {
2543 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2544 if (!expression)
2545 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002546 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547 }
2548 else if (NCH(n) == 4) {
2549 expr_ty expr1, expr2;
2550
2551 expr1 = ast_for_expr(c, CHILD(n, 1));
2552 if (!expr1)
2553 return NULL;
2554 expr2 = ast_for_expr(c, CHILD(n, 3));
2555 if (!expr2)
2556 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002557
Thomas Wouters89f507f2006-12-13 04:49:30 +00002558 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
Neal Norwitz79792652005-11-14 04:25:03 +00002560 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 "improper number of parts to 'assert' statement: %d",
2562 NCH(n));
2563 return NULL;
2564}
2565
2566static asdl_seq *
2567ast_for_suite(struct compiling *c, const node *n)
2568{
2569 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002570 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 stmt_ty s;
2572 int i, total, num, end, pos = 0;
2573 node *ch;
2574
2575 REQ(n, suite);
2576
2577 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002578 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002582 n = CHILD(n, 0);
2583 /* simple_stmt always ends with a NEWLINE,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002584 and may have a trailing SEMI
Thomas Wouters89f507f2006-12-13 04:49:30 +00002585 */
2586 end = NCH(n) - 1;
2587 if (TYPE(CHILD(n, end - 1)) == SEMI)
2588 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 for (i = 0; i < end; i += 2) {
2591 ch = CHILD(n, i);
2592 s = ast_for_stmt(c, ch);
2593 if (!s)
2594 return NULL;
2595 asdl_seq_SET(seq, pos++, s);
2596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 }
2598 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002599 for (i = 2; i < (NCH(n) - 1); i++) {
2600 ch = CHILD(n, i);
2601 REQ(ch, stmt);
2602 num = num_stmts(ch);
2603 if (num == 1) {
2604 /* small_stmt or compound_stmt with only one child */
2605 s = ast_for_stmt(c, ch);
2606 if (!s)
2607 return NULL;
2608 asdl_seq_SET(seq, pos++, s);
2609 }
2610 else {
2611 int j;
2612 ch = CHILD(ch, 0);
2613 REQ(ch, simple_stmt);
2614 for (j = 0; j < NCH(ch); j += 2) {
2615 /* statement terminates with a semi-colon ';' */
2616 if (NCH(CHILD(ch, j)) == 0) {
2617 assert((j + 1) == NCH(ch));
2618 break;
2619 }
2620 s = ast_for_stmt(c, CHILD(ch, j));
2621 if (!s)
2622 return NULL;
2623 asdl_seq_SET(seq, pos++, s);
2624 }
2625 }
2626 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627 }
2628 assert(pos == seq->size);
2629 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630}
2631
2632static stmt_ty
2633ast_for_if_stmt(struct compiling *c, const node *n)
2634{
2635 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2636 ['else' ':' suite]
2637 */
2638 char *s;
2639
2640 REQ(n, if_stmt);
2641
2642 if (NCH(n) == 4) {
2643 expr_ty expression;
2644 asdl_seq *suite_seq;
2645
2646 expression = ast_for_expr(c, CHILD(n, 1));
2647 if (!expression)
2648 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002649 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002650 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 return NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002652
Guido van Rossumd8faa362007-04-27 19:54:29 +00002653 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2654 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002656
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 s = STR(CHILD(n, 4));
2658 /* s[2], the third character in the string, will be
2659 's' for el_s_e, or
2660 'i' for el_i_f
2661 */
2662 if (s[2] == 's') {
2663 expr_ty expression;
2664 asdl_seq *seq1, *seq2;
2665
2666 expression = ast_for_expr(c, CHILD(n, 1));
2667 if (!expression)
2668 return NULL;
2669 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002670 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 return NULL;
2672 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002673 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 return NULL;
2675
Guido van Rossumd8faa362007-04-27 19:54:29 +00002676 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2677 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 }
2679 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002680 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 expr_ty expression;
2682 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 asdl_seq *orelse = NULL;
2684 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 /* must reference the child n_elif+1 since 'else' token is third,
2686 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2688 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2689 has_else = 1;
2690 n_elif -= 3;
2691 }
2692 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693
Thomas Wouters89f507f2006-12-13 04:49:30 +00002694 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002695 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696
Thomas Wouters89f507f2006-12-13 04:49:30 +00002697 orelse = asdl_seq_new(1, c->c_arena);
2698 if (!orelse)
2699 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002701 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002703 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2704 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002706 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2707 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002710 asdl_seq_SET(orelse, 0,
2711 If(expression, suite_seq, suite_seq2,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002712 LINENO(CHILD(n, NCH(n) - 6)),
2713 CHILD(n, NCH(n) - 6)->n_col_offset,
2714 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002715 /* the just-created orelse handled the last elif */
2716 n_elif--;
2717 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 for (i = 0; i < n_elif; i++) {
2720 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2722 if (!newobj)
2723 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002725 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730
Thomas Wouters89f507f2006-12-13 04:49:30 +00002731 asdl_seq_SET(newobj, 0,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002732 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002733 LINENO(CHILD(n, off)),
2734 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 orelse = newobj;
2736 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002737 expression = ast_for_expr(c, CHILD(n, 1));
2738 if (!expression)
2739 return NULL;
2740 suite_seq = ast_for_suite(c, CHILD(n, 3));
2741 if (!suite_seq)
2742 return NULL;
2743 return If(expression, suite_seq, orelse,
2744 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002745 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002746
2747 PyErr_Format(PyExc_SystemError,
2748 "unexpected token in 'if' statement: %s", s);
2749 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750}
2751
2752static stmt_ty
2753ast_for_while_stmt(struct compiling *c, const node *n)
2754{
2755 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2756 REQ(n, while_stmt);
2757
2758 if (NCH(n) == 4) {
2759 expr_ty expression;
2760 asdl_seq *suite_seq;
2761
2762 expression = ast_for_expr(c, CHILD(n, 1));
2763 if (!expression)
2764 return NULL;
2765 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002766 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002768 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 }
2770 else if (NCH(n) == 7) {
2771 expr_ty expression;
2772 asdl_seq *seq1, *seq2;
2773
2774 expression = ast_for_expr(c, CHILD(n, 1));
2775 if (!expression)
2776 return NULL;
2777 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002778 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 return NULL;
2780 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002781 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782 return NULL;
2783
Thomas Wouters89f507f2006-12-13 04:49:30 +00002784 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786
2787 PyErr_Format(PyExc_SystemError,
2788 "wrong number of tokens for 'while' statement: %d",
2789 NCH(n));
2790 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791}
2792
2793static stmt_ty
2794ast_for_for_stmt(struct compiling *c, const node *n)
2795{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002796 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 expr_ty expression;
2798 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002799 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2801 REQ(n, for_stmt);
2802
2803 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002804 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805 if (!seq)
2806 return NULL;
2807 }
2808
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002809 node_target = CHILD(n, 1);
2810 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002811 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002813 /* Check the # of children rather than the length of _target, since
2814 for x, in ... has 1 element in _target, but still requires a Tuple. */
2815 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002816 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002818 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002820 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002821 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 return NULL;
2823 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002824 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 return NULL;
2826
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2828 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829}
2830
2831static excepthandler_ty
2832ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2833{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002834 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 REQ(exc, except_clause);
2836 REQ(body, suite);
2837
2838 if (NCH(exc) == 1) {
2839 asdl_seq *suite_seq = ast_for_suite(c, body);
2840 if (!suite_seq)
2841 return NULL;
2842
Neal Norwitzad74aa82008-03-31 05:14:30 +00002843 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002844 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 }
2846 else if (NCH(exc) == 2) {
2847 expr_ty expression;
2848 asdl_seq *suite_seq;
2849
2850 expression = ast_for_expr(c, CHILD(exc, 1));
2851 if (!expression)
2852 return NULL;
2853 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002854 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return NULL;
2856
Neal Norwitzad74aa82008-03-31 05:14:30 +00002857 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002858 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002859 }
2860 else if (NCH(exc) == 4) {
2861 asdl_seq *suite_seq;
2862 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002863 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002864 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002867 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002868 return NULL;
2869 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002870 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871 return NULL;
2872
Neal Norwitzad74aa82008-03-31 05:14:30 +00002873 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002874 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002876
2877 PyErr_Format(PyExc_SystemError,
2878 "wrong number of children for 'except' clause: %d",
2879 NCH(exc));
2880 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881}
2882
2883static stmt_ty
2884ast_for_try_stmt(struct compiling *c, const node *n)
2885{
Neal Norwitzf599f422005-12-17 21:33:47 +00002886 const int nch = NCH(n);
2887 int n_except = (nch - 3)/3;
2888 asdl_seq *body, *orelse = NULL, *finally = NULL;
2889
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002890 REQ(n, try_stmt);
2891
Neal Norwitzf599f422005-12-17 21:33:47 +00002892 body = ast_for_suite(c, CHILD(n, 2));
2893 if (body == NULL)
2894 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895
Neal Norwitzf599f422005-12-17 21:33:47 +00002896 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2897 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2898 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2899 /* we can assume it's an "else",
2900 because nch >= 9 for try-else-finally and
2901 it would otherwise have a type of except_clause */
2902 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2903 if (orelse == NULL)
2904 return NULL;
2905 n_except--;
2906 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907
Neal Norwitzf599f422005-12-17 21:33:47 +00002908 finally = ast_for_suite(c, CHILD(n, nch - 1));
2909 if (finally == NULL)
2910 return NULL;
2911 n_except--;
2912 }
2913 else {
2914 /* we can assume it's an "else",
2915 otherwise it would have a type of except_clause */
2916 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2917 if (orelse == NULL)
2918 return NULL;
2919 n_except--;
2920 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002922 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002923 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 return NULL;
2925 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00002926
Neal Norwitzf599f422005-12-17 21:33:47 +00002927 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002928 int i;
2929 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002930 /* process except statements to create a try ... except */
2931 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2932 if (handlers == NULL)
2933 return NULL;
2934
2935 for (i = 0; i < n_except; i++) {
2936 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2937 CHILD(n, 5 + i * 3));
2938 if (!e)
2939 return NULL;
2940 asdl_seq_SET(handlers, i, e);
2941 }
2942
Thomas Wouters89f507f2006-12-13 04:49:30 +00002943 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002944 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002945 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002947
2948 /* if a 'finally' is present too, we nest the TryExcept within a
2949 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002950 body = asdl_seq_new(1, c->c_arena);
2951 if (body == NULL)
2952 return NULL;
2953 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002954 }
2955
2956 /* must be a try ... finally (except clauses are in body, if any exist) */
2957 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002958 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959}
2960
Georg Brandl0c315622009-05-25 21:10:36 +00002961/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002962static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002963ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002964{
2965 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002966
Georg Brandl0c315622009-05-25 21:10:36 +00002967 REQ(n, with_item);
2968 context_expr = ast_for_expr(c, CHILD(n, 0));
Amaury Forgeot d'Arcfc34ac52010-08-19 20:26:00 +00002969 if (!context_expr)
2970 return NULL;
Georg Brandl0c315622009-05-25 21:10:36 +00002971 if (NCH(n) == 3) {
2972 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973
2974 if (!optional_vars) {
2975 return NULL;
2976 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002977 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002978 return NULL;
2979 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002980 }
2981
Georg Brandl0c315622009-05-25 21:10:36 +00002982 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002984}
2985
Georg Brandl0c315622009-05-25 21:10:36 +00002986/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2987static stmt_ty
2988ast_for_with_stmt(struct compiling *c, const node *n)
2989{
2990 int i;
2991 stmt_ty ret;
2992 asdl_seq *inner;
2993
2994 REQ(n, with_stmt);
2995
2996 /* process the with items inside-out */
2997 i = NCH(n) - 1;
2998 /* the suite of the innermost with item is the suite of the with stmt */
2999 inner = ast_for_suite(c, CHILD(n, i));
3000 if (!inner)
3001 return NULL;
3002
3003 for (;;) {
3004 i -= 2;
3005 ret = ast_for_with_item(c, CHILD(n, i), inner);
3006 if (!ret)
3007 return NULL;
3008 /* was this the last item? */
3009 if (i == 1)
3010 break;
3011 /* if not, wrap the result so far in a new sequence */
3012 inner = asdl_seq_new(1, c->c_arena);
3013 if (!inner)
3014 return NULL;
3015 asdl_seq_SET(inner, 0, ret);
3016 }
3017
3018 return ret;
3019}
3020
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003022ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003024 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003025 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003026 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003027 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003028
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003029 REQ(n, classdef);
3030
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003031 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 s = ast_for_suite(c, CHILD(n, 3));
3033 if (!s)
3034 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003035 classname = NEW_IDENTIFIER(CHILD(n, 1));
3036 if (!classname)
3037 return NULL;
3038 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3039 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003040 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003041
3042 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003043 s = ast_for_suite(c, CHILD(n,5));
3044 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003045 return NULL;
3046 classname = NEW_IDENTIFIER(CHILD(n, 1));
3047 if (!classname)
3048 return NULL;
3049 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3050 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 }
3052
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003053 /* class NAME '(' arglist ')' ':' suite */
3054 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003055 {
3056 PyObject *dummy_name;
3057 expr_ty dummy;
3058 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3059 if (!dummy_name)
3060 return NULL;
3061 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3062 call = ast_for_call(c, CHILD(n, 3), dummy);
3063 if (!call)
3064 return NULL;
3065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003067 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003069 classname = NEW_IDENTIFIER(CHILD(n, 1));
3070 if (!classname)
3071 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003072
Benjamin Peterson30760062008-11-25 04:02:28 +00003073 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003074 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003075 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076}
3077
3078static stmt_ty
3079ast_for_stmt(struct compiling *c, const node *n)
3080{
3081 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 assert(NCH(n) == 1);
3083 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 }
3085 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003086 assert(num_stmts(n) == 1);
3087 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 }
3089 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003090 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003091 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3092 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003093 */
3094 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 case expr_stmt:
3096 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 case del_stmt:
3098 return ast_for_del_stmt(c, n);
3099 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003100 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 case flow_stmt:
3102 return ast_for_flow_stmt(c, n);
3103 case import_stmt:
3104 return ast_for_import_stmt(c, n);
3105 case global_stmt:
3106 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003107 case nonlocal_stmt:
3108 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 case assert_stmt:
3110 return ast_for_assert_stmt(c, n);
3111 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003112 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3114 TYPE(n), NCH(n));
3115 return NULL;
3116 }
3117 }
3118 else {
3119 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003120 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003121 */
3122 node *ch = CHILD(n, 0);
3123 REQ(n, compound_stmt);
3124 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 case if_stmt:
3126 return ast_for_if_stmt(c, ch);
3127 case while_stmt:
3128 return ast_for_while_stmt(c, ch);
3129 case for_stmt:
3130 return ast_for_for_stmt(c, ch);
3131 case try_stmt:
3132 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003133 case with_stmt:
3134 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003136 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003137 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003138 return ast_for_classdef(c, ch, NULL);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003139 case decorated:
3140 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003142 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3144 TYPE(n), NCH(n));
3145 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003146 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 }
3148}
3149
3150static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003151parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003153 const char *end;
3154 long x;
3155 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003157 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003158 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003159#endif
3160
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003161 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 errno = 0;
3163 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003167 if (s[0] == '0') {
3168 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3169 if (x < 0 && errno == 0) {
3170 return PyLong_FromString((char *)s,
3171 (char **)0,
3172 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003173 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 }
3175 else
3176 x = PyOS_strtol((char *)s, (char **)&end, 0);
3177 if (*end == '\0') {
3178 if (errno != 0)
3179 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003180 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 }
3182 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003185 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003186 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3187 if (compl.imag == -1.0 && PyErr_Occurred())
3188 return NULL;
3189 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 }
3191 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003194 dx = PyOS_string_to_double(s, NULL, NULL);
3195 if (dx == -1.0 && PyErr_Occurred())
3196 return NULL;
3197 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003198 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199}
3200
3201static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003202decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 PyObject *u, *v;
3205 char *s, *t;
3206 t = s = (char *)*sPtr;
3207 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3208 while (s < end && (*s & 0x80)) s++;
3209 *sPtr = s;
3210 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3211 if (u == NULL)
3212 return NULL;
3213 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3214 Py_DECREF(u);
3215 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216}
3217
3218static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003219decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003220{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 PyObject *v, *u;
3222 char *buf;
3223 char *p;
3224 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003225
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 if (encoding == NULL) {
3227 buf = (char *)s;
3228 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003230 /* check for integer overflow */
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003231 if (len > PY_SIZE_MAX / 6)
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003232 return NULL;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003233 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3234 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3235 u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236 if (u == NULL)
3237 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003238 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 end = s + len;
3240 while (s < end) {
3241 if (*s == '\\') {
3242 *p++ = *s++;
3243 if (*s & 0x80) {
3244 strcpy(p, "u005c");
3245 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003246 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003247 }
3248 if (*s & 0x80) { /* XXX inefficient */
3249 PyObject *w;
3250 char *r;
3251 Py_ssize_t rn, i;
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003252 w = decode_utf8(c, &s, end, "utf-32-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003253 if (w == NULL) {
3254 Py_DECREF(u);
3255 return NULL;
3256 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003257 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003258 rn = Py_SIZE(w);
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003259 assert(rn % 4 == 0);
3260 for (i = 0; i < rn; i += 4) {
3261 sprintf(p, "\\U%02x%02x%02x%02x",
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 r[i + 0] & 0xFF,
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003263 r[i + 1] & 0xFF,
3264 r[i + 2] & 0xFF,
3265 r[i + 3] & 0xFF);
3266 p += 10;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003267 }
Benjamin Peterson7dc5ac52009-10-29 01:22:38 +00003268 /* Should be impossible to overflow */
3269 assert(p - buf <= Py_SIZE(u));
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 Py_DECREF(w);
3271 } else {
3272 *p++ = *s++;
3273 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003274 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 len = p - buf;
3276 s = buf;
3277 }
3278 if (rawmode)
3279 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3280 else
3281 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3282 Py_XDECREF(u);
3283 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284}
3285
3286/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003287 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288 * parsestr parses it, and returns the decoded Python string object.
3289 */
3290static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003291parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 size_t len;
3294 const char *s = STR(n);
3295 int quote = Py_CHARMASK(*s);
3296 int rawmode = 0;
3297 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003298 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003299 if (quote == 'b' || quote == 'B') {
3300 quote = *++s;
3301 *bytesmode = 1;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003302 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003303 if (quote == 'r' || quote == 'R') {
3304 quote = *++s;
3305 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003306 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 }
3308 if (quote != '\'' && quote != '\"') {
3309 PyErr_BadInternalCall();
3310 return NULL;
3311 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003312 s++;
3313 len = strlen(s);
3314 if (len > INT_MAX) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003315 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003316 "string to parse is too long");
3317 return NULL;
3318 }
3319 if (s[--len] != quote) {
3320 PyErr_BadInternalCall();
3321 return NULL;
3322 }
3323 if (len >= 4 && s[0] == quote && s[1] == quote) {
3324 s += 2;
3325 len -= 2;
3326 if (s[--len] != quote || s[--len] != quote) {
3327 PyErr_BadInternalCall();
3328 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003329 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003330 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003331 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003332 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003333 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003334 if (*bytesmode) {
3335 /* Disallow non-ascii characters (but not escapes) */
3336 const char *c;
3337 for (c = s; *c; c++) {
3338 if (Py_CHARMASK(*c) >= 0x80) {
3339 ast_error(n, "bytes can only contain ASCII "
3340 "literal characters.");
3341 return NULL;
3342 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003343 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003344 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003345 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003346 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003347 if (rawmode || strchr(s, '\\') == NULL) {
3348 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003349 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003350 if (u == NULL || !*bytesmode)
3351 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003352 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003353 Py_DECREF(u);
3354 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003355 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003356 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003357 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003358 return PyUnicode_FromStringAndSize(s, len);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00003359 } else {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003360 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003361 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003362 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003363 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003364 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003365}
3366
Guido van Rossum29fd7122007-11-12 01:13:56 +00003367/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368 * compile-time literal catenation, calling parsestr() on each piece, and
3369 * pasting the intermediate results together.
3370 */
3371static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003372parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003374 PyObject *v;
3375 int i;
3376 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003377 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003378 if (v != NULL) {
3379 /* String literal concatenation */
3380 for (i = 1; i < NCH(n); i++) {
3381 PyObject *s;
3382 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003383 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003384 if (s == NULL)
3385 goto onError;
3386 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003387 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003388 goto onError;
3389 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003390 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3391 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003392 if (v == NULL)
3393 goto onError;
3394 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003395 else {
3396 PyObject *temp = PyUnicode_Concat(v, s);
3397 Py_DECREF(s);
3398 Py_DECREF(v);
3399 v = temp;
3400 if (v == NULL)
3401 goto onError;
3402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003403 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003404 }
3405 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003406
Guido van Rossumd8faa362007-04-27 19:54:29 +00003407 onError:
3408 Py_XDECREF(v);
3409 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410}