blob: d81f001646011ce1e22b0bef64af60c5f935c44d [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
61 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000062 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000063 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
74 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
Benjamin Petersonb58dda72009-01-18 22:27:04 +0000194 sprintf(buf, "Non-statement found: %d %d",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000229 /* PEP 3120 */
230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000360 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 NULL,
362};
363
364static int
Benjamin Peterson78565b22009-06-28 19:19:51 +0000365forbidden_name(identifier name, const node *n)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 const char **p;
Benjamin Peterson78565b22009-06-28 19:19:51 +0000368 assert(PyUnicode_Check(name));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000369 for (p = FORBIDDEN; *p; p++) {
Benjamin Peterson78565b22009-06-28 19:19:51 +0000370 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 ast_error(n, "assignment to keyword");
372 return 1;
373 }
374 }
375 return 0;
376}
377
Jeremy Hyltona8293132006-02-28 17:58:27 +0000378/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
380 Only sets context for expr kinds that "can appear in assignment context"
381 (according to ../Parser/Python.asdl). For other expr kinds, it sets
382 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000386set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
388 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389 /* If a particular expression type can't be used for assign / delete,
390 set expr_name to its name and an error message will be generated.
391 */
392 const char* expr_name = NULL;
393
394 /* The ast defines augmented store and load contexts, but the
395 implementation here doesn't actually use them. The code may be
396 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000399 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 */
401 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402
403 switch (e->kind) {
404 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Attribute.ctx = ctx;
406 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000408 e->v.Subscript.ctx = ctx;
409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 case Starred_kind:
411 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000412 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000413 return 0;
414 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000416 if (ctx == Store) {
Benjamin Peterson78565b22009-06-28 19:19:51 +0000417 if (forbidden_name(e->v.Name.id, n))
Guido van Rossume7ba4952007-06-06 23:52:48 +0000418 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 }
420 e->v.Name.ctx = ctx;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.List.ctx = ctx;
424 s = e->v.List.elts;
425 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 case Tuple_kind:
Benjamin Peterson78565b22009-06-28 19:19:51 +0000427 if (asdl_seq_LEN(e->v.Tuple.elts)) {
428 e->v.Tuple.ctx = ctx;
429 s = e->v.Tuple.elts;
430 }
431 else {
432 expr_name = "()";
433 }
Thomas Wouters89f507f2006-12-13 04:49:30 +0000434 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000435 case Lambda_kind:
436 expr_name = "lambda";
437 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000439 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000441 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000443 case UnaryOp_kind:
444 expr_name = "operator";
445 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000446 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000447 expr_name = "generator expression";
448 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000449 case Yield_kind:
450 expr_name = "yield expression";
451 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000452 case ListComp_kind:
453 expr_name = "list comprehension";
454 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000455 case SetComp_kind:
456 expr_name = "set comprehension";
457 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000458 case DictComp_kind:
459 expr_name = "dict comprehension";
460 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000461 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000462 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 case Num_kind:
464 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000465 expr_name = "literal";
466 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000467 case Ellipsis_kind:
468 expr_name = "Ellipsis";
469 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000470 case Compare_kind:
471 expr_name = "comparison";
472 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000473 case IfExp_kind:
474 expr_name = "conditional expression";
475 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000476 default:
477 PyErr_Format(PyExc_SystemError,
478 "unexpected expression in assignment %d (line %d)",
479 e->kind, e->lineno);
480 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000482 /* Check for error string set by switch */
483 if (expr_name) {
484 char buf[300];
485 PyOS_snprintf(buf, sizeof(buf),
486 "can't %s %s",
487 ctx == Store ? "assign to" : "delete",
488 expr_name);
489 return ast_error(n, buf);
490 }
491
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000493 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494 */
495 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000496 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497
Thomas Wouters89f507f2006-12-13 04:49:30 +0000498 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000499 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000500 return 0;
501 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 }
503 return 1;
504}
505
506static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000507ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000508{
509 REQ(n, augassign);
510 n = CHILD(n, 0);
511 switch (STR(n)[0]) {
512 case '+':
513 return Add;
514 case '-':
515 return Sub;
516 case '/':
517 if (STR(n)[1] == '/')
518 return FloorDiv;
519 else
520 return Div;
521 case '%':
522 return Mod;
523 case '<':
524 return LShift;
525 case '>':
526 return RShift;
527 case '&':
528 return BitAnd;
529 case '^':
530 return BitXor;
531 case '|':
532 return BitOr;
533 case '*':
534 if (STR(n)[1] == '*')
535 return Pow;
536 else
537 return Mult;
538 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000539 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000540 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 }
542}
543
544static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000545ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000547 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 |'is' 'not'
549 */
550 REQ(n, comp_op);
551 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000552 n = CHILD(n, 0);
553 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554 case LESS:
555 return Lt;
556 case GREATER:
557 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000558 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559 return Eq;
560 case LESSEQUAL:
561 return LtE;
562 case GREATEREQUAL:
563 return GtE;
564 case NOTEQUAL:
565 return NotEq;
566 case NAME:
567 if (strcmp(STR(n), "in") == 0)
568 return In;
569 if (strcmp(STR(n), "is") == 0)
570 return Is;
571 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000572 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000574 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 }
577 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000578 /* handle "not in" and "is not" */
579 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 case NAME:
581 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
582 return NotIn;
583 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
584 return IsNot;
585 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000586 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000588 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000589 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 }
Neal Norwitz79792652005-11-14 04:25:03 +0000591 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000593 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000594}
595
596static asdl_seq *
597seq_for_testlist(struct compiling *c, const node *n)
598{
599 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000600 asdl_seq *seq;
601 expr_ty expression;
602 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000603 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000605 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606 if (!seq)
607 return NULL;
608
609 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000610 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
612 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000613 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000614 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615
616 assert(i / 2 < seq->size);
617 asdl_seq_SET(seq, i / 2, expression);
618 }
619 return seq;
620}
621
Neal Norwitzc1505362006-12-28 06:47:50 +0000622static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000623compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000624{
625 identifier name;
626 expr_ty annotation = NULL;
627 node *ch;
628
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000629 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000630 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000631 name = NEW_IDENTIFIER(ch);
632 if (!name)
633 return NULL;
634
635 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
636 annotation = ast_for_expr(c, CHILD(n, 2));
637 if (!annotation)
638 return NULL;
639 }
640
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000641 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000642#if 0
643 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
644 if (!set_context(c, result, Store, n))
645 return NULL;
646 return result;
647#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648}
649
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650/* returns -1 if failed to handle keyword only arguments
651 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000652 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000653 ^^^
654 start pointing here
655 */
656static int
657handle_keywordonly_args(struct compiling *c, const node *n, int start,
658 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
659{
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000660 PyObject *argname;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000661 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000662 expr_ty expression, annotation;
663 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000664 int i = start;
665 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000666
667 if (kwonlyargs == NULL) {
668 ast_error(CHILD(n, start), "named arguments must follow bare *");
669 return -1;
670 }
671 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 while (i < NCH(n)) {
673 ch = CHILD(n, i);
674 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000675 case vfpdef:
676 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000677 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000678 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000679 asdl_seq_SET(kwdefaults, j, expression);
680 i += 2; /* '=' and test */
681 }
682 else { /* setting NULL if no default value exists */
683 asdl_seq_SET(kwdefaults, j, NULL);
684 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000685 if (NCH(ch) == 3) {
686 /* ch is NAME ':' test */
687 annotation = ast_for_expr(c, CHILD(ch, 2));
688 if (!annotation) {
689 ast_error(ch, "expected expression");
690 goto error;
691 }
692 }
693 else {
694 annotation = NULL;
695 }
696 ch = CHILD(ch, 0);
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000697 argname = NEW_IDENTIFIER(ch);
698 if (!argname)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000699 goto error;
Benjamin Petersond951e7b2008-11-25 22:19:53 +0000700 arg = arg(argname, annotation, c->c_arena);
701 if (!arg)
702 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +0000703 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000704 i += 2; /* the name and the comma */
705 break;
706 case DOUBLESTAR:
707 return i;
708 default:
709 ast_error(ch, "unexpected node");
710 goto error;
711 }
712 }
713 return i;
714 error:
715 return -1;
716}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000717
Jeremy Hyltona8293132006-02-28 17:58:27 +0000718/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000719
720static arguments_ty
721ast_for_arguments(struct compiling *c, const node *n)
722{
Neal Norwitzc1505362006-12-28 06:47:50 +0000723 /* This function handles both typedargslist (function definition)
724 and varargslist (lambda definition).
725
726 parameters: '(' [typedargslist] ')'
727 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
729 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000730 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000731 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000732 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000733 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
734 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000735 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000736 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000738 int i, j, k, nposargs = 0, nkwonlyargs = 0;
739 int nposdefaults = 0, found_default = 0;
740 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000742 arg_ty arg;
743 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744 node *ch;
745
746 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000748 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
749 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000750 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000752 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753
Jeremy Hyltone921e022008-07-17 16:37:17 +0000754 /* First count the number of positional args & defaults. The
755 variable i is the loop index for this for loop and the next.
756 The next loop picks up where the first leaves off.
757 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 ch = CHILD(n, i);
760 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000761 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000762 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000763 if (i < NCH(n) && /* skip argument following star */
764 (TYPE(CHILD(n, i)) == tfpdef ||
765 TYPE(CHILD(n, i)) == vfpdef)) {
766 i++;
767 }
768 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000770 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000771 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 /* count the number of keyword only args &
775 defaults for keyword only args */
776 for ( ; i < NCH(n); ++i) {
777 ch = CHILD(n, i);
778 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000779 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000780 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
782 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000784 kwonlyargs = (nkwonlyargs ?
785 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
786 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 posdefaults = (nposdefaults ?
789 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
790 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000791 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000792 /* The length of kwonlyargs and kwdefaults are same
793 since we set NULL as default for keyword only argument w/o default
794 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000795 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000796 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
797 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000798 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000799
800 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000801 ast_error(n, "more than 255 arguments");
802 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000803 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000805 /* tfpdef: NAME [':' test]
806 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807 */
808 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000809 j = 0; /* index for defaults */
810 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000812 ch = CHILD(n, i);
813 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000814 case tfpdef:
815 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
817 anything other than EQUAL or a comma? */
818 /* XXX Should NCH(n) check be made a separate check? */
819 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000820 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
821 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822 goto error;
823 assert(posdefaults != NULL);
824 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828 else if (found_default) {
829 ast_error(n,
830 "non-default argument follows default argument");
831 goto error;
832 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000833 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000834 if (!arg)
835 goto error;
836 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 i += 2; /* the name and the comma */
838 break;
839 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000841 ast_error(CHILD(n, i),
842 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000843 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000844 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000845 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000846 if (TYPE(ch) == COMMA) {
847 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000848 i += 2; /* now follows keyword only arguments */
849 res = handle_keywordonly_args(c, n, i,
850 kwonlyargs, kwdefaults);
851 if (res == -1) goto error;
852 i = res; /* res has new position to process */
853 }
854 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000856 if (!vararg)
857 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000858 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000859 /* there is an annotation on the vararg */
860 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000861 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000862 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000863 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
864 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000865 int res = 0;
866 res = handle_keywordonly_args(c, n, i,
867 kwonlyargs, kwdefaults);
868 if (res == -1) goto error;
869 i = res; /* res has new position to process */
870 }
871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872 break;
873 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000874 ch = CHILD(n, i+1); /* tfpdef */
875 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000876 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
877 if (NCH(ch) > 1) {
878 /* there is an annotation on the kwarg */
879 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
880 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000881 if (!kwarg)
882 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 i += 3;
884 break;
885 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000886 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000887 "unexpected node in varargslist: %d @ %d",
888 TYPE(ch), i);
889 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000890 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000892 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
893 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000895 Py_XDECREF(vararg);
896 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897 return NULL;
898}
899
900static expr_ty
901ast_for_dotted_name(struct compiling *c, const node *n)
902{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000903 expr_ty e;
904 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000905 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 int i;
907
908 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000909
910 lineno = LINENO(n);
911 col_offset = n->n_col_offset;
912
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913 id = NEW_IDENTIFIER(CHILD(n, 0));
914 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000915 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000916 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000918 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919
920 for (i = 2; i < NCH(n); i+=2) {
921 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000922 if (!id)
923 return NULL;
924 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
925 if (!e)
926 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927 }
928
929 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000930}
931
932static expr_ty
933ast_for_decorator(struct compiling *c, const node *n)
934{
935 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
936 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000937 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000938
939 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000940 REQ(CHILD(n, 0), AT);
941 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942
943 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
944 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000945 return NULL;
946
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000947 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000948 d = name_expr;
949 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000950 }
951 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000952 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000953 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000954 if (!d)
955 return NULL;
956 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 }
958 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000959 d = ast_for_call(c, CHILD(n, 3), name_expr);
960 if (!d)
961 return NULL;
962 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963 }
964
965 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966}
967
968static asdl_seq*
969ast_for_decorators(struct compiling *c, const node *n)
970{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000971 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000972 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 int i;
974
975 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000976 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 if (!decorator_seq)
978 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000981 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000982 if (!d)
983 return NULL;
984 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985 }
986 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987}
988
989static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000990ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000991{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000992 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000993 identifier name;
994 arguments_ty args;
995 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000996 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000997 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998
999 REQ(n, funcdef);
1000
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001 name = NEW_IDENTIFIER(CHILD(n, name_i));
1002 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1005 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001006 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001007 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1008 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1009 if (!returns)
1010 return NULL;
1011 name_i += 2;
1012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013 body = ast_for_suite(c, CHILD(n, name_i + 3));
1014 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001015 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001016
Neal Norwitzc1505362006-12-28 06:47:50 +00001017 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001018 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019}
1020
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001021static stmt_ty
1022ast_for_decorated(struct compiling *c, const node *n)
1023{
1024 /* decorated: decorators (classdef | funcdef) */
1025 stmt_ty thing = NULL;
1026 asdl_seq *decorator_seq = NULL;
1027
1028 REQ(n, decorated);
1029
1030 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1031 if (!decorator_seq)
1032 return NULL;
1033
1034 assert(TYPE(CHILD(n, 1)) == funcdef ||
1035 TYPE(CHILD(n, 1)) == classdef);
1036
1037 if (TYPE(CHILD(n, 1)) == funcdef) {
1038 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1039 } else if (TYPE(CHILD(n, 1)) == classdef) {
1040 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1041 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001042 /* we count the decorators in when talking about the class' or
1043 * function's line number */
1044 if (thing) {
1045 thing->lineno = LINENO(n);
1046 thing->col_offset = n->n_col_offset;
1047 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001048 return thing;
1049}
1050
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051static expr_ty
1052ast_for_lambdef(struct compiling *c, const node *n)
1053{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001054 /* lambdef: 'lambda' [varargslist] ':' test
1055 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 arguments_ty args;
1057 expr_ty expression;
1058
1059 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001060 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1061 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062 if (!args)
1063 return NULL;
1064 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001065 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001066 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067 }
1068 else {
1069 args = ast_for_arguments(c, CHILD(n, 1));
1070 if (!args)
1071 return NULL;
1072 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001073 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001074 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075 }
1076
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001077 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078}
1079
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001080static expr_ty
1081ast_for_ifexpr(struct compiling *c, const node *n)
1082{
1083 /* test: or_test 'if' or_test 'else' test */
1084 expr_ty expression, body, orelse;
1085
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001086 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087 body = ast_for_expr(c, CHILD(n, 0));
1088 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001090 expression = ast_for_expr(c, CHILD(n, 2));
1091 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001093 orelse = ast_for_expr(c, CHILD(n, 4));
1094 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001095 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001096 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1097 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001098}
1099
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001101 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102
Nick Coghlan650f0d02007-04-15 12:05:43 +00001103 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104*/
1105
1106static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001107count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001108{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001109 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 count_comp_for:
1112 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001113 REQ(n, comp_for);
1114 if (NCH(n) == 5)
1115 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 else
1117 return n_fors;
1118 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001119 REQ(n, comp_iter);
1120 n = CHILD(n, 0);
1121 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001123 else if (TYPE(n) == comp_if) {
1124 if (NCH(n) == 3) {
1125 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001127 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128 else
1129 return n_fors;
1130 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001131
Guido van Rossumd8faa362007-04-27 19:54:29 +00001132 /* Should never be reached */
1133 PyErr_SetString(PyExc_SystemError,
1134 "logic error in count_comp_fors");
1135 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136}
1137
Nick Coghlan650f0d02007-04-15 12:05:43 +00001138/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139
Nick Coghlan650f0d02007-04-15 12:05:43 +00001140 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141*/
1142
1143static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001144count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147
Guido van Rossumd8faa362007-04-27 19:54:29 +00001148 while (1) {
1149 REQ(n, comp_iter);
1150 if (TYPE(CHILD(n, 0)) == comp_for)
1151 return n_ifs;
1152 n = CHILD(n, 0);
1153 REQ(n, comp_if);
1154 n_ifs++;
1155 if (NCH(n) == 2)
1156 return n_ifs;
1157 n = CHILD(n, 2);
1158 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159}
1160
Guido van Rossum992d4a32007-07-11 13:09:30 +00001161static asdl_seq *
1162ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001165 asdl_seq *comps;
1166
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001167 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 if (n_fors == -1)
1169 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170
Nick Coghlan650f0d02007-04-15 12:05:43 +00001171 comps = asdl_seq_new(n_fors, c->c_arena);
1172 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001174
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001176 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177 asdl_seq *t;
1178 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001179 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180
Guido van Rossum992d4a32007-07-11 13:09:30 +00001181 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182
Guido van Rossum992d4a32007-07-11 13:09:30 +00001183 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001184 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001187 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001190
Thomas Wouters89f507f2006-12-13 04:49:30 +00001191 /* Check the # of children rather than the length of t, since
1192 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1193 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001194 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1195 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001197 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001198 c->c_arena),
1199 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001200
Nick Coghlan650f0d02007-04-15 12:05:43 +00001201 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001203
Guido van Rossum992d4a32007-07-11 13:09:30 +00001204 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 int j, n_ifs;
1206 asdl_seq *ifs;
1207
Guido van Rossum992d4a32007-07-11 13:09:30 +00001208 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001209 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001212
1213 ifs = asdl_seq_new(n_ifs, c->c_arena);
1214 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001216
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001218 REQ(n, comp_iter);
1219 n = CHILD(n, 0);
1220 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221
Guido van Rossum992d4a32007-07-11 13:09:30 +00001222 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001223 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001224 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001225 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001226 if (NCH(n) == 3)
1227 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001229 /* on exit, must guarantee that n is a comp_for */
1230 if (TYPE(n) == comp_iter)
1231 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001232 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001234 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001236 return comps;
1237}
1238
1239static expr_ty
1240ast_for_itercomp(struct compiling *c, const node *n, int type)
1241{
1242 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1243 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1244 expr_ty elt;
1245 asdl_seq *comps;
1246
1247 assert(NCH(n) > 1);
1248
1249 elt = ast_for_expr(c, CHILD(n, 0));
1250 if (!elt)
1251 return NULL;
1252
1253 comps = ast_for_comprehension(c, CHILD(n, 1));
1254 if (!comps)
1255 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001256
1257 if (type == COMP_GENEXP)
1258 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1259 else if (type == COMP_LISTCOMP)
1260 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1261 else if (type == COMP_SETCOMP)
1262 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1263 else
1264 /* Should never happen */
1265 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266}
1267
1268static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001269ast_for_dictcomp(struct compiling *c, const node *n)
1270{
1271 expr_ty key, value;
1272 asdl_seq *comps;
1273
1274 assert(NCH(n) > 3);
1275 REQ(CHILD(n, 1), COLON);
1276
1277 key = ast_for_expr(c, CHILD(n, 0));
1278 if (!key)
1279 return NULL;
1280
1281 value = ast_for_expr(c, CHILD(n, 2));
1282 if (!value)
1283 return NULL;
1284
1285 comps = ast_for_comprehension(c, CHILD(n, 3));
1286 if (!comps)
1287 return NULL;
1288
1289 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1290}
1291
1292static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001293ast_for_genexp(struct compiling *c, const node *n)
1294{
1295 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001296 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001297}
1298
1299static expr_ty
1300ast_for_listcomp(struct compiling *c, const node *n)
1301{
1302 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001303 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001304}
1305
1306static expr_ty
1307ast_for_setcomp(struct compiling *c, const node *n)
1308{
1309 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001310 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001311}
1312
1313
1314static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315ast_for_atom(struct compiling *c, const node *n)
1316{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001317 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1318 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001319 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001320 */
1321 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001322 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323
1324 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001325 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001326 /* All names start in Load context, but may later be
1327 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001328 PyObject *name = NEW_IDENTIFIER(ch);
1329 if (!name)
1330 return NULL;
1331 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1332 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001334 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001335 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001336 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001337 PyObject *type, *value, *tback, *errstr;
1338 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001339 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001340 if (errstr) {
1341 char *s = "";
1342 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001343 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001344 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1345 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001346 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001347 } else {
1348 ast_error(n, "(unicode error) unknown error");
1349 }
1350 Py_DECREF(type);
1351 Py_DECREF(value);
1352 Py_XDECREF(tback);
1353 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001354 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001355 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001356 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001357 if (bytesmode)
1358 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1359 else
1360 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 }
1362 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001363 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 if (!pynum)
1365 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001366
Thomas Wouters89f507f2006-12-13 04:49:30 +00001367 PyArena_AddPyObject(c->c_arena, pynum);
1368 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 }
Georg Brandldde00282007-03-18 19:01:53 +00001370 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001371 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001373 ch = CHILD(n, 1);
1374
1375 if (TYPE(ch) == RPAR)
1376 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1377
1378 if (TYPE(ch) == yield_expr)
1379 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001380
1381 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1382 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 return ast_for_genexp(c, ch);
Benjamin Peterson78565b22009-06-28 19:19:51 +00001384
Nick Coghlan650f0d02007-04-15 12:05:43 +00001385 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 ch = CHILD(n, 1);
1388
1389 if (TYPE(ch) == RSQB)
1390 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1391
Nick Coghlan650f0d02007-04-15 12:05:43 +00001392 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001393 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1394 asdl_seq *elts = seq_for_testlist(c, ch);
1395 if (!elts)
1396 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001397
Thomas Wouters89f507f2006-12-13 04:49:30 +00001398 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1399 }
1400 else
1401 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1404 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001405 int i, size;
1406 asdl_seq *keys, *values;
1407
1408 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001409 if (TYPE(ch) == RBRACE) {
1410 /* it's an empty dict */
1411 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1412 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1413 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001414 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001415 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001416 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001417 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001418 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001419 for (i = 0; i < NCH(ch); i += 2) {
1420 expr_ty expression;
1421 expression = ast_for_expr(c, CHILD(ch, i));
1422 if (!expression)
1423 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001424 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001425 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001426 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1427 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1428 /* it's a set comprehension */
1429 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001430 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1431 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001432 } else {
1433 /* it's a dict */
1434 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1435 keys = asdl_seq_new(size, c->c_arena);
1436 if (!keys)
1437 return NULL;
1438
1439 values = asdl_seq_new(size, c->c_arena);
1440 if (!values)
1441 return NULL;
1442
1443 for (i = 0; i < NCH(ch); i += 4) {
1444 expr_ty expression;
1445
1446 expression = ast_for_expr(c, CHILD(ch, i));
1447 if (!expression)
1448 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001449
Guido van Rossum86e58e22006-08-28 15:27:34 +00001450 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001451
Guido van Rossum86e58e22006-08-28 15:27:34 +00001452 expression = ast_for_expr(c, CHILD(ch, i + 2));
1453 if (!expression)
1454 return NULL;
1455
1456 asdl_seq_SET(values, i / 4, expression);
1457 }
1458 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1459 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001460 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1463 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 }
1465}
1466
1467static slice_ty
1468ast_for_slice(struct compiling *c, const node *n)
1469{
1470 node *ch;
1471 expr_ty lower = NULL, upper = NULL, step = NULL;
1472
1473 REQ(n, subscript);
1474
1475 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001476 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 sliceop: ':' [test]
1478 */
1479 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 if (NCH(n) == 1 && TYPE(ch) == test) {
1481 /* 'step' variable hold no significance in terms of being used over
1482 other vars */
1483 step = ast_for_expr(c, ch);
1484 if (!step)
1485 return NULL;
1486
Thomas Wouters89f507f2006-12-13 04:49:30 +00001487 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 }
1489
1490 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001491 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 if (!lower)
1493 return NULL;
1494 }
1495
1496 /* If there's an upper bound it's in the second or third position. */
1497 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001498 if (NCH(n) > 1) {
1499 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500
Thomas Wouters89f507f2006-12-13 04:49:30 +00001501 if (TYPE(n2) == test) {
1502 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503 if (!upper)
1504 return NULL;
1505 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001506 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001508 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 if (TYPE(n2) == test) {
1511 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512 if (!upper)
1513 return NULL;
1514 }
1515 }
1516
1517 ch = CHILD(n, NCH(n) - 1);
1518 if (TYPE(ch) == sliceop) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00001519 if (NCH(ch) != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001520 ch = CHILD(ch, 1);
1521 if (TYPE(ch) == test) {
1522 step = ast_for_expr(c, ch);
1523 if (!step)
1524 return NULL;
1525 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526 }
1527 }
1528
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001529 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530}
1531
1532static expr_ty
1533ast_for_binop(struct compiling *c, const node *n)
1534{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535 /* Must account for a sequence of expressions.
1536 How should A op B op C by represented?
1537 BinOp(BinOp(A, op, B), op, C).
1538 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540 int i, nops;
1541 expr_ty expr1, expr2, result;
1542 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 expr1 = ast_for_expr(c, CHILD(n, 0));
1545 if (!expr1)
1546 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 expr2 = ast_for_expr(c, CHILD(n, 2));
1549 if (!expr2)
1550 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 newoperator = get_operator(CHILD(n, 1));
1553 if (!newoperator)
1554 return NULL;
1555
1556 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1557 c->c_arena);
1558 if (!result)
1559 return NULL;
1560
1561 nops = (NCH(n) - 1) / 2;
1562 for (i = 1; i < nops; i++) {
1563 expr_ty tmp_result, tmp;
1564 const node* next_oper = CHILD(n, i * 2 + 1);
1565
1566 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001567 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001568 return NULL;
1569
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1571 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001572 return NULL;
1573
Guido van Rossumd8faa362007-04-27 19:54:29 +00001574 tmp_result = BinOp(result, newoperator, tmp,
1575 LINENO(next_oper), next_oper->n_col_offset,
1576 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001577 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001578 return NULL;
1579 result = tmp_result;
1580 }
1581 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001582}
1583
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001584static expr_ty
1585ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1586{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001587 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1588 subscriptlist: subscript (',' subscript)* [',']
1589 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1590 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001591 REQ(n, trailer);
1592 if (TYPE(CHILD(n, 0)) == LPAR) {
1593 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001594 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1595 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001596 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001597 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001599 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001600 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1601 if (!attr_id)
1602 return NULL;
1603 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001604 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001605 }
1606 else {
1607 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001608 REQ(CHILD(n, 2), RSQB);
1609 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001610 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1612 if (!slc)
1613 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001614 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1615 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001616 }
1617 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001618 /* The grammar is ambiguous here. The ambiguity is resolved
1619 by treating the sequence as a tuple literal if there are
1620 no slice features.
1621 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001622 int j;
1623 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001624 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001625 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001626 asdl_seq *slices, *elts;
1627 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001628 if (!slices)
1629 return NULL;
1630 for (j = 0; j < NCH(n); j += 2) {
1631 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001632 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001634 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001635 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001636 asdl_seq_SET(slices, j / 2, slc);
1637 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001638 if (!simple) {
1639 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001640 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001641 }
1642 /* extract Index values and put them in a Tuple */
1643 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001644 if (!elts)
1645 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001646 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1647 slc = (slice_ty)asdl_seq_GET(slices, j);
1648 assert(slc->kind == Index_kind && slc->v.Index.value);
1649 asdl_seq_SET(elts, j, slc->v.Index.value);
1650 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001651 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001652 if (!e)
1653 return NULL;
1654 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001655 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001656 }
1657 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658}
1659
1660static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001661ast_for_factor(struct compiling *c, const node *n)
1662{
1663 node *pfactor, *ppower, *patom, *pnum;
1664 expr_ty expression;
1665
1666 /* If the unary - operator is applied to a constant, don't generate
1667 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1668 constant. The peephole optimizer already does something like
1669 this but it doesn't handle the case where the constant is
1670 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1671 PyLongObject.
1672 */
1673 if (TYPE(CHILD(n, 0)) == MINUS
1674 && NCH(n) == 2
1675 && TYPE((pfactor = CHILD(n, 1))) == factor
1676 && NCH(pfactor) == 1
1677 && TYPE((ppower = CHILD(pfactor, 0))) == power
1678 && NCH(ppower) == 1
1679 && TYPE((patom = CHILD(ppower, 0))) == atom
1680 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1681 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1682 if (s == NULL)
1683 return NULL;
1684 s[0] = '-';
1685 strcpy(s + 1, STR(pnum));
1686 PyObject_FREE(STR(pnum));
1687 STR(pnum) = s;
1688 return ast_for_atom(c, patom);
1689 }
1690
1691 expression = ast_for_expr(c, CHILD(n, 1));
1692 if (!expression)
1693 return NULL;
1694
1695 switch (TYPE(CHILD(n, 0))) {
1696 case PLUS:
1697 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1698 c->c_arena);
1699 case MINUS:
1700 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1701 c->c_arena);
1702 case TILDE:
1703 return UnaryOp(Invert, expression, LINENO(n),
1704 n->n_col_offset, c->c_arena);
1705 }
1706 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1707 TYPE(CHILD(n, 0)));
1708 return NULL;
1709}
1710
1711static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001712ast_for_power(struct compiling *c, const node *n)
1713{
1714 /* power: atom trailer* ('**' factor)*
1715 */
1716 int i;
1717 expr_ty e, tmp;
1718 REQ(n, power);
1719 e = ast_for_atom(c, CHILD(n, 0));
1720 if (!e)
1721 return NULL;
1722 if (NCH(n) == 1)
1723 return e;
1724 for (i = 1; i < NCH(n); i++) {
1725 node *ch = CHILD(n, i);
1726 if (TYPE(ch) != trailer)
1727 break;
1728 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001731 tmp->lineno = e->lineno;
1732 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001733 e = tmp;
1734 }
1735 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1736 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001737 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001738 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001739 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001740 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001741 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 e = tmp;
1743 }
1744 return e;
1745}
1746
Guido van Rossum0368b722007-05-11 16:50:42 +00001747static expr_ty
1748ast_for_starred(struct compiling *c, const node *n)
1749{
1750 expr_ty tmp;
1751 REQ(n, star_expr);
1752
1753 tmp = ast_for_expr(c, CHILD(n, 1));
1754 if (!tmp)
1755 return NULL;
1756
1757 /* The Load context is changed later. */
1758 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1759}
1760
1761
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762/* Do not name a variable 'expr'! Will cause a compile error.
1763*/
1764
1765static expr_ty
1766ast_for_expr(struct compiling *c, const node *n)
1767{
1768 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001769 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001770 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001771 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001772 and_test: not_test ('and' not_test)*
1773 not_test: 'not' not_test | comparison
1774 comparison: expr (comp_op expr)*
1775 expr: xor_expr ('|' xor_expr)*
1776 xor_expr: and_expr ('^' and_expr)*
1777 and_expr: shift_expr ('&' shift_expr)*
1778 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1779 arith_expr: term (('+'|'-') term)*
1780 term: factor (('*'|'/'|'%'|'//') factor)*
1781 factor: ('+'|'-'|'~') factor | power
1782 power: atom trailer* ('**' factor)*
1783 */
1784
1785 asdl_seq *seq;
1786 int i;
1787
1788 loop:
1789 switch (TYPE(n)) {
1790 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001791 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001792 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001793 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001795 else if (NCH(n) > 1)
1796 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001797 /* Fallthrough */
1798 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 case and_test:
1800 if (NCH(n) == 1) {
1801 n = CHILD(n, 0);
1802 goto loop;
1803 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001804 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 if (!seq)
1806 return NULL;
1807 for (i = 0; i < NCH(n); i += 2) {
1808 expr_ty e = ast_for_expr(c, CHILD(n, i));
1809 if (!e)
1810 return NULL;
1811 asdl_seq_SET(seq, i / 2, e);
1812 }
1813 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001814 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1815 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001816 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001817 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 case not_test:
1819 if (NCH(n) == 1) {
1820 n = CHILD(n, 0);
1821 goto loop;
1822 }
1823 else {
1824 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1825 if (!expression)
1826 return NULL;
1827
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001828 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1829 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 }
1831 case comparison:
1832 if (NCH(n) == 1) {
1833 n = CHILD(n, 0);
1834 goto loop;
1835 }
1836 else {
1837 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001838 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001839 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 if (!ops)
1842 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001843 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 return NULL;
1846 }
1847 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001850 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001851 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001853 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854
1855 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001856 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001858 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 asdl_seq_SET(cmps, i / 2, expression);
1862 }
1863 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001864 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001868 return Compare(expression, ops, cmps, LINENO(n),
1869 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870 }
1871 break;
1872
Guido van Rossum0368b722007-05-11 16:50:42 +00001873 case star_expr:
1874 if (TYPE(CHILD(n, 0)) == STAR) {
1875 return ast_for_starred(c, n);
1876 }
1877 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 /* The next five cases all handle BinOps. The main body of code
1879 is the same in each case, but the switch turned inside out to
1880 reuse the code for each type of operator.
1881 */
1882 case expr:
1883 case xor_expr:
1884 case and_expr:
1885 case shift_expr:
1886 case arith_expr:
1887 case term:
1888 if (NCH(n) == 1) {
1889 n = CHILD(n, 0);
1890 goto loop;
1891 }
1892 return ast_for_binop(c, n);
1893 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001894 expr_ty exp = NULL;
1895 if (NCH(n) == 2) {
1896 exp = ast_for_testlist(c, CHILD(n, 1));
1897 if (!exp)
1898 return NULL;
1899 }
1900 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1901 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001902 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 if (NCH(n) == 1) {
1904 n = CHILD(n, 0);
1905 goto loop;
1906 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001907 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001908 case power:
1909 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001911 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 return NULL;
1913 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001914 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915 return NULL;
1916}
1917
1918static expr_ty
1919ast_for_call(struct compiling *c, const node *n, expr_ty func)
1920{
1921 /*
1922 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1923 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001924 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 */
1926
1927 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001928 asdl_seq *args;
1929 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930 expr_ty vararg = NULL, kwarg = NULL;
1931
1932 REQ(n, arglist);
1933
1934 nargs = 0;
1935 nkeywords = 0;
1936 ngens = 0;
1937 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001938 node *ch = CHILD(n, i);
1939 if (TYPE(ch) == argument) {
1940 if (NCH(ch) == 1)
1941 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001942 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001943 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001945 nkeywords++;
1946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947 }
1948 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001949 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 "if not sole argument");
1951 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 }
1953
1954 if (nargs + nkeywords + ngens > 255) {
1955 ast_error(n, "more than 255 arguments");
1956 return NULL;
1957 }
1958
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001959 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001961 return NULL;
1962 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001964 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 nargs = 0;
1966 nkeywords = 0;
1967 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001968 node *ch = CHILD(n, i);
1969 if (TYPE(ch) == argument) {
1970 expr_ty e;
1971 if (NCH(ch) == 1) {
1972 if (nkeywords) {
1973 ast_error(CHILD(ch, 0),
1974 "non-keyword arg after keyword arg");
1975 return NULL;
1976 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001977 if (vararg) {
1978 ast_error(CHILD(ch, 0),
1979 "only named arguments may follow *expression");
1980 return NULL;
1981 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001983 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001984 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 asdl_seq_SET(args, nargs++, e);
1986 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001987 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001988 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001991 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 else {
1994 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001995 identifier key, tmp;
1996 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997
Thomas Wouters89f507f2006-12-13 04:49:30 +00001998 /* CHILD(ch, 0) is test, but must be an identifier? */
1999 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002000 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002001 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 /* f(lambda x: x[0] = 3) ends up getting parsed with
2003 * LHS test = lambda x: x[0], and RHS test = 3.
2004 * SF bug 132313 points out that complaining about a keyword
2005 * then is very confusing.
2006 */
2007 if (e->kind == Lambda_kind) {
2008 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002009 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010 } else if (e->kind != Name_kind) {
2011 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002012 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002013 } else if (forbidden_name(e->v.Name.id, ch)) {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002014 return NULL;
2015 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002017 for (k = 0; k < nkeywords; k++) {
2018 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2019 if (!PyUnicode_Compare(tmp, key)) {
2020 ast_error(CHILD(ch, 0), "keyword argument repeated");
2021 return NULL;
2022 }
2023 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002024 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002026 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002027 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002029 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002030 asdl_seq_SET(keywords, nkeywords++, kw);
2031 }
2032 }
2033 else if (TYPE(ch) == STAR) {
2034 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002035 if (!vararg)
2036 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002037 i++;
2038 }
2039 else if (TYPE(ch) == DOUBLESTAR) {
2040 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002041 if (!kwarg)
2042 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002043 i++;
2044 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 }
2046
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002047 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048}
2049
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002051ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002053 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002054 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002057 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002058 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002059 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 }
2061 else {
2062 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002063 TYPE(n) == testlist1);
2064 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002066 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 else {
2068 asdl_seq *tmp = seq_for_testlist(c, n);
2069 if (!tmp)
2070 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002073}
2074
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075static stmt_ty
2076ast_for_expr_stmt(struct compiling *c, const node *n)
2077{
2078 REQ(n, expr_stmt);
2079 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2080 | ('=' (yield_expr|testlist))*)
2081 testlist: test (',' test)* [',']
2082 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002083 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 test: ... here starts the operator precendence dance
2085 */
2086
2087 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 if (!e)
2090 return NULL;
2091
Thomas Wouters89f507f2006-12-13 04:49:30 +00002092 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 }
2094 else if (TYPE(CHILD(n, 1)) == augassign) {
2095 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002096 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002097 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098
Thomas Wouters89f507f2006-12-13 04:49:30 +00002099 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 if (!expr1)
2101 return NULL;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002102 if(!set_context(c, expr1, Store, ch))
2103 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104
Thomas Wouters89f507f2006-12-13 04:49:30 +00002105 ch = CHILD(n, 2);
2106 if (TYPE(ch) == testlist)
2107 expr2 = ast_for_testlist(c, ch);
2108 else
2109 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002110 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 return NULL;
2112
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002113 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002114 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 return NULL;
2116
Thomas Wouters89f507f2006-12-13 04:49:30 +00002117 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 }
2119 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002120 int i;
2121 asdl_seq *targets;
2122 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 expr_ty expression;
2124
Thomas Wouters89f507f2006-12-13 04:49:30 +00002125 /* a normal assignment */
2126 REQ(CHILD(n, 1), EQUAL);
2127 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2128 if (!targets)
2129 return NULL;
2130 for (i = 0; i < NCH(n) - 2; i += 2) {
2131 expr_ty e;
2132 node *ch = CHILD(n, i);
2133 if (TYPE(ch) == yield_expr) {
2134 ast_error(ch, "assignment to yield expression not possible");
2135 return NULL;
2136 }
2137 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138
Thomas Wouters89f507f2006-12-13 04:49:30 +00002139 /* set context to assign */
2140 if (!e)
2141 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002143 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145
Thomas Wouters89f507f2006-12-13 04:49:30 +00002146 asdl_seq_SET(targets, i / 2, e);
2147 }
2148 value = CHILD(n, NCH(n) - 1);
2149 if (TYPE(value) == testlist)
2150 expression = ast_for_testlist(c, value);
2151 else
2152 expression = ast_for_expr(c, value);
2153 if (!expression)
2154 return NULL;
2155 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157}
2158
Benjamin Peterson78565b22009-06-28 19:19:51 +00002159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002161ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162{
2163 asdl_seq *seq;
2164 int i;
2165 expr_ty e;
2166
2167 REQ(n, exprlist);
2168
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002169 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002173 e = ast_for_expr(c, CHILD(n, i));
2174 if (!e)
2175 return NULL;
2176 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002177 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002178 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179 }
2180 return seq;
2181}
2182
2183static stmt_ty
2184ast_for_del_stmt(struct compiling *c, const node *n)
2185{
2186 asdl_seq *expr_list;
2187
2188 /* del_stmt: 'del' exprlist */
2189 REQ(n, del_stmt);
2190
2191 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2192 if (!expr_list)
2193 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002194 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195}
2196
2197static stmt_ty
2198ast_for_flow_stmt(struct compiling *c, const node *n)
2199{
2200 /*
2201 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2202 | yield_stmt
2203 break_stmt: 'break'
2204 continue_stmt: 'continue'
2205 return_stmt: 'return' [testlist]
2206 yield_stmt: yield_expr
2207 yield_expr: 'yield' testlist
2208 raise_stmt: 'raise' [test [',' test [',' test]]]
2209 */
2210 node *ch;
2211
2212 REQ(n, flow_stmt);
2213 ch = CHILD(n, 0);
2214 switch (TYPE(ch)) {
2215 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002216 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002218 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002220 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2221 if (!exp)
2222 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002223 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 }
2225 case return_stmt:
2226 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002229 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 if (!expression)
2231 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002232 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 }
2234 case raise_stmt:
2235 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002236 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2237 else if (NCH(ch) >= 2) {
2238 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2240 if (!expression)
2241 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002242 if (NCH(ch) == 4) {
2243 cause = ast_for_expr(c, CHILD(ch, 3));
2244 if (!cause)
2245 return NULL;
2246 }
2247 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002250 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 "unexpected flow_stmt: %d", TYPE(ch));
2252 return NULL;
2253 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002254
2255 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2256 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257}
2258
2259static alias_ty
Benjamin Peterson78565b22009-06-28 19:19:51 +00002260alias_for_import_name(struct compiling *c, const node *n, int store)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261{
2262 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002263 import_as_name: NAME ['as' NAME]
2264 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002265 dotted_name: NAME ('.' NAME)*
2266 */
Benjamin Peterson78565b22009-06-28 19:19:51 +00002267 identifier str, name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002268
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 loop:
2270 switch (TYPE(n)) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002271 case import_as_name: {
2272 node *name_node = CHILD(n, 0);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002273 str = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002274 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002275 if (!name)
2276 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002277 if (NCH(n) == 3) {
2278 node *str_node = CHILD(n, 2);
2279 str = NEW_IDENTIFIER(str_node);
2280 if (!str)
2281 return NULL;
2282 if (store && forbidden_name(str, str_node))
2283 return NULL;
2284 }
2285 else {
2286 if (forbidden_name(name, name_node))
2287 return NULL;
2288 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002289 return alias(name, str, c->c_arena);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291 case dotted_as_name:
2292 if (NCH(n) == 1) {
2293 n = CHILD(n, 0);
2294 goto loop;
2295 }
2296 else {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002297 node *asname_node = CHILD(n, 2);
2298 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002299 if (!a)
2300 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 assert(!a->asname);
Benjamin Peterson78565b22009-06-28 19:19:51 +00002302 a->asname = NEW_IDENTIFIER(asname_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002303 if (!a->asname)
2304 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002305 if (forbidden_name(a->asname, asname_node))
2306 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307 return a;
2308 }
2309 break;
2310 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002311 if (NCH(n) == 1) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002312 node *name_node = CHILD(n, 0);
2313 name = NEW_IDENTIFIER(name_node);
Benjamin Peterson30760062008-11-25 04:02:28 +00002314 if (!name)
2315 return NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002316 if (store && forbidden_name(name, name_node))
2317 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00002318 return alias(name, NULL, c->c_arena);
2319 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 else {
2321 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002322 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002323 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002325 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326
2327 len = 0;
2328 for (i = 0; i < NCH(n); i += 2)
2329 /* length of string plus one for the dot */
2330 len += strlen(STR(CHILD(n, i))) + 1;
2331 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002332 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 if (!str)
2334 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002335 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 if (!s)
2337 return NULL;
2338 for (i = 0; i < NCH(n); i += 2) {
2339 char *sch = STR(CHILD(n, i));
2340 strcpy(s, STR(CHILD(n, i)));
2341 s += strlen(sch);
2342 *s++ = '.';
2343 }
2344 --s;
2345 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002346 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2347 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002348 NULL);
2349 Py_DECREF(str);
2350 if (!uni)
2351 return NULL;
2352 str = uni;
2353 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002354 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002355 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 }
2357 break;
2358 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002359 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002360 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002361 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002363 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 "unexpected import name: %d", TYPE(n));
2365 return NULL;
2366 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002367
2368 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002369 return NULL;
2370}
2371
2372static stmt_ty
2373ast_for_import_stmt(struct compiling *c, const node *n)
2374{
2375 /*
2376 import_stmt: import_name | import_from
2377 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002378 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2379 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002381 int lineno;
2382 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 int i;
2384 asdl_seq *aliases;
2385
2386 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002387 lineno = LINENO(n);
2388 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002390 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002392 REQ(n, dotted_as_names);
2393 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2394 if (!aliases)
2395 return NULL;
2396 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002397 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002398 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002400 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002401 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002404 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 int idx, ndots = 0;
2407 alias_ty mod = NULL;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002408 identifier modname = NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002410 /* Count the number of dots (for relative imports) and check for the
2411 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002412 for (idx = 1; idx < NCH(n); idx++) {
2413 if (TYPE(CHILD(n, idx)) == dotted_name) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002414 mod = alias_for_import_name(c, CHILD(n, idx), 0);
2415 if (!mod)
2416 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 idx++;
2418 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002419 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2420 /* three consecutive dots are tokenized as one ELLIPSIS */
2421 ndots += 3;
2422 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 } else if (TYPE(CHILD(n, idx)) != DOT) {
2424 break;
2425 }
2426 ndots++;
2427 }
2428 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002429 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002430 case STAR:
2431 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 n = CHILD(n, idx);
2433 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 break;
2435 case LPAR:
2436 /* from ... import (x, y, z) */
2437 n = CHILD(n, idx + 1);
2438 n_children = NCH(n);
2439 break;
2440 case import_as_names:
2441 /* from ... import x, y, z */
2442 n = CHILD(n, idx);
2443 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002444 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 ast_error(n, "trailing comma not allowed without"
2446 " surrounding parentheses");
2447 return NULL;
2448 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 break;
2450 default:
2451 ast_error(n, "Unexpected node-type in from-import");
2452 return NULL;
2453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2456 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458
2459 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002460 if (TYPE(n) == STAR) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002461 alias_ty import_alias = alias_for_import_name(c, n, 1);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002462 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002464 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002466 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 for (i = 0; i < NCH(n); i += 2) {
Benjamin Peterson78565b22009-06-28 19:19:51 +00002468 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002469 if (!import_alias)
2470 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002474 if (mod != NULL)
2475 modname = mod->name;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002476 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002477 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 }
Neal Norwitz79792652005-11-14 04:25:03 +00002479 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 "unknown import statement: starts with command '%s'",
2481 STR(CHILD(n, 0)));
2482 return NULL;
2483}
2484
2485static stmt_ty
2486ast_for_global_stmt(struct compiling *c, const node *n)
2487{
2488 /* global_stmt: 'global' NAME (',' NAME)* */
2489 identifier name;
2490 asdl_seq *s;
2491 int i;
2492
2493 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002494 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002498 name = NEW_IDENTIFIER(CHILD(n, i));
2499 if (!name)
2500 return NULL;
2501 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002503 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504}
2505
2506static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002507ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2508{
2509 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2510 identifier name;
2511 asdl_seq *s;
2512 int i;
2513
2514 REQ(n, nonlocal_stmt);
2515 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2516 if (!s)
2517 return NULL;
2518 for (i = 1; i < NCH(n); i += 2) {
2519 name = NEW_IDENTIFIER(CHILD(n, i));
2520 if (!name)
2521 return NULL;
2522 asdl_seq_SET(s, i / 2, name);
2523 }
2524 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2525}
2526
2527static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528ast_for_assert_stmt(struct compiling *c, const node *n)
2529{
2530 /* assert_stmt: 'assert' test [',' test] */
2531 REQ(n, assert_stmt);
2532 if (NCH(n) == 2) {
2533 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2534 if (!expression)
2535 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002536 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
2538 else if (NCH(n) == 4) {
2539 expr_ty expr1, expr2;
2540
2541 expr1 = ast_for_expr(c, CHILD(n, 1));
2542 if (!expr1)
2543 return NULL;
2544 expr2 = ast_for_expr(c, CHILD(n, 3));
2545 if (!expr2)
2546 return NULL;
2547
Thomas Wouters89f507f2006-12-13 04:49:30 +00002548 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549 }
Neal Norwitz79792652005-11-14 04:25:03 +00002550 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 "improper number of parts to 'assert' statement: %d",
2552 NCH(n));
2553 return NULL;
2554}
2555
2556static asdl_seq *
2557ast_for_suite(struct compiling *c, const node *n)
2558{
2559 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002560 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002561 stmt_ty s;
2562 int i, total, num, end, pos = 0;
2563 node *ch;
2564
2565 REQ(n, suite);
2566
2567 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002568 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002572 n = CHILD(n, 0);
2573 /* simple_stmt always ends with a NEWLINE,
2574 and may have a trailing SEMI
2575 */
2576 end = NCH(n) - 1;
2577 if (TYPE(CHILD(n, end - 1)) == SEMI)
2578 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 for (i = 0; i < end; i += 2) {
2581 ch = CHILD(n, i);
2582 s = ast_for_stmt(c, ch);
2583 if (!s)
2584 return NULL;
2585 asdl_seq_SET(seq, pos++, s);
2586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 }
2588 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 for (i = 2; i < (NCH(n) - 1); i++) {
2590 ch = CHILD(n, i);
2591 REQ(ch, stmt);
2592 num = num_stmts(ch);
2593 if (num == 1) {
2594 /* small_stmt or compound_stmt with only one child */
2595 s = ast_for_stmt(c, ch);
2596 if (!s)
2597 return NULL;
2598 asdl_seq_SET(seq, pos++, s);
2599 }
2600 else {
2601 int j;
2602 ch = CHILD(ch, 0);
2603 REQ(ch, simple_stmt);
2604 for (j = 0; j < NCH(ch); j += 2) {
2605 /* statement terminates with a semi-colon ';' */
2606 if (NCH(CHILD(ch, j)) == 0) {
2607 assert((j + 1) == NCH(ch));
2608 break;
2609 }
2610 s = ast_for_stmt(c, CHILD(ch, j));
2611 if (!s)
2612 return NULL;
2613 asdl_seq_SET(seq, pos++, s);
2614 }
2615 }
2616 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
2618 assert(pos == seq->size);
2619 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620}
2621
2622static stmt_ty
2623ast_for_if_stmt(struct compiling *c, const node *n)
2624{
2625 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2626 ['else' ':' suite]
2627 */
2628 char *s;
2629
2630 REQ(n, if_stmt);
2631
2632 if (NCH(n) == 4) {
2633 expr_ty expression;
2634 asdl_seq *suite_seq;
2635
2636 expression = ast_for_expr(c, CHILD(n, 1));
2637 if (!expression)
2638 return NULL;
2639 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002640 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 return NULL;
2642
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2644 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002646
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 s = STR(CHILD(n, 4));
2648 /* s[2], the third character in the string, will be
2649 's' for el_s_e, or
2650 'i' for el_i_f
2651 */
2652 if (s[2] == 's') {
2653 expr_ty expression;
2654 asdl_seq *seq1, *seq2;
2655
2656 expression = ast_for_expr(c, CHILD(n, 1));
2657 if (!expression)
2658 return NULL;
2659 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002660 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 return NULL;
2662 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 return NULL;
2665
Guido van Rossumd8faa362007-04-27 19:54:29 +00002666 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2667 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668 }
2669 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 expr_ty expression;
2672 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002673 asdl_seq *orelse = NULL;
2674 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 /* must reference the child n_elif+1 since 'else' token is third,
2676 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2678 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2679 has_else = 1;
2680 n_elif -= 3;
2681 }
2682 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Thomas Wouters89f507f2006-12-13 04:49:30 +00002684 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002685 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686
Thomas Wouters89f507f2006-12-13 04:49:30 +00002687 orelse = asdl_seq_new(1, c->c_arena);
2688 if (!orelse)
2689 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002691 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002693 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2694 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002696 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2697 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699
Guido van Rossumd8faa362007-04-27 19:54:29 +00002700 asdl_seq_SET(orelse, 0,
2701 If(expression, suite_seq, suite_seq2,
2702 LINENO(CHILD(n, NCH(n) - 6)),
2703 CHILD(n, NCH(n) - 6)->n_col_offset,
2704 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 /* the just-created orelse handled the last elif */
2706 n_elif--;
2707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 for (i = 0; i < n_elif; i++) {
2710 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002711 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2712 if (!newobj)
2713 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002715 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002718 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Thomas Wouters89f507f2006-12-13 04:49:30 +00002721 asdl_seq_SET(newobj, 0,
2722 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002723 LINENO(CHILD(n, off)),
2724 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002725 orelse = newobj;
2726 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002727 expression = ast_for_expr(c, CHILD(n, 1));
2728 if (!expression)
2729 return NULL;
2730 suite_seq = ast_for_suite(c, CHILD(n, 3));
2731 if (!suite_seq)
2732 return NULL;
2733 return If(expression, suite_seq, orelse,
2734 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002735 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002736
2737 PyErr_Format(PyExc_SystemError,
2738 "unexpected token in 'if' statement: %s", s);
2739 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740}
2741
2742static stmt_ty
2743ast_for_while_stmt(struct compiling *c, const node *n)
2744{
2745 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2746 REQ(n, while_stmt);
2747
2748 if (NCH(n) == 4) {
2749 expr_ty expression;
2750 asdl_seq *suite_seq;
2751
2752 expression = ast_for_expr(c, CHILD(n, 1));
2753 if (!expression)
2754 return NULL;
2755 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002756 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 }
2760 else if (NCH(n) == 7) {
2761 expr_ty expression;
2762 asdl_seq *seq1, *seq2;
2763
2764 expression = ast_for_expr(c, CHILD(n, 1));
2765 if (!expression)
2766 return NULL;
2767 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002768 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769 return NULL;
2770 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 return NULL;
2773
Thomas Wouters89f507f2006-12-13 04:49:30 +00002774 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776
2777 PyErr_Format(PyExc_SystemError,
2778 "wrong number of tokens for 'while' statement: %d",
2779 NCH(n));
2780 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781}
2782
2783static stmt_ty
2784ast_for_for_stmt(struct compiling *c, const node *n)
2785{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 expr_ty expression;
2788 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002789 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2791 REQ(n, for_stmt);
2792
2793 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002794 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 if (!seq)
2796 return NULL;
2797 }
2798
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002799 node_target = CHILD(n, 1);
2800 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002801 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002802 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002803 /* Check the # of children rather than the length of _target, since
2804 for x, in ... has 1 element in _target, but still requires a Tuple. */
2805 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002806 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002808 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002810 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002811 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002812 return NULL;
2813 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002814 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 return NULL;
2816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002817 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2818 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819}
2820
2821static excepthandler_ty
2822ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2823{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002824 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002825 REQ(exc, except_clause);
2826 REQ(body, suite);
2827
2828 if (NCH(exc) == 1) {
2829 asdl_seq *suite_seq = ast_for_suite(c, body);
2830 if (!suite_seq)
2831 return NULL;
2832
Neal Norwitzad74aa82008-03-31 05:14:30 +00002833 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002834 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835 }
2836 else if (NCH(exc) == 2) {
2837 expr_ty expression;
2838 asdl_seq *suite_seq;
2839
2840 expression = ast_for_expr(c, CHILD(exc, 1));
2841 if (!expression)
2842 return NULL;
2843 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002844 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 return NULL;
2846
Neal Norwitzad74aa82008-03-31 05:14:30 +00002847 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002848 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
2850 else if (NCH(exc) == 4) {
2851 asdl_seq *suite_seq;
2852 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002853 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002854 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002857 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 return NULL;
2859 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002860 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002861 return NULL;
2862
Neal Norwitzad74aa82008-03-31 05:14:30 +00002863 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002864 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002866
2867 PyErr_Format(PyExc_SystemError,
2868 "wrong number of children for 'except' clause: %d",
2869 NCH(exc));
2870 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871}
2872
2873static stmt_ty
2874ast_for_try_stmt(struct compiling *c, const node *n)
2875{
Neal Norwitzf599f422005-12-17 21:33:47 +00002876 const int nch = NCH(n);
2877 int n_except = (nch - 3)/3;
2878 asdl_seq *body, *orelse = NULL, *finally = NULL;
2879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880 REQ(n, try_stmt);
2881
Neal Norwitzf599f422005-12-17 21:33:47 +00002882 body = ast_for_suite(c, CHILD(n, 2));
2883 if (body == NULL)
2884 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002885
Neal Norwitzf599f422005-12-17 21:33:47 +00002886 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2887 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2888 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2889 /* we can assume it's an "else",
2890 because nch >= 9 for try-else-finally and
2891 it would otherwise have a type of except_clause */
2892 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2893 if (orelse == NULL)
2894 return NULL;
2895 n_except--;
2896 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897
Neal Norwitzf599f422005-12-17 21:33:47 +00002898 finally = ast_for_suite(c, CHILD(n, nch - 1));
2899 if (finally == NULL)
2900 return NULL;
2901 n_except--;
2902 }
2903 else {
2904 /* we can assume it's an "else",
2905 otherwise it would have a type of except_clause */
2906 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2907 if (orelse == NULL)
2908 return NULL;
2909 n_except--;
2910 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002912 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002913 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 return NULL;
2915 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002916
2917 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 int i;
2919 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 /* process except statements to create a try ... except */
2921 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2922 if (handlers == NULL)
2923 return NULL;
2924
2925 for (i = 0; i < n_except; i++) {
2926 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2927 CHILD(n, 5 + i * 3));
2928 if (!e)
2929 return NULL;
2930 asdl_seq_SET(handlers, i, e);
2931 }
2932
Thomas Wouters89f507f2006-12-13 04:49:30 +00002933 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002934 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002935 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002936 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002937
2938 /* if a 'finally' is present too, we nest the TryExcept within a
2939 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002940 body = asdl_seq_new(1, c->c_arena);
2941 if (body == NULL)
2942 return NULL;
2943 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002944 }
2945
2946 /* must be a try ... finally (except clauses are in body, if any exist) */
2947 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002948 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949}
2950
Georg Brandl0c315622009-05-25 21:10:36 +00002951/* with_item: test ['as' expr] */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002952static stmt_ty
Georg Brandl0c315622009-05-25 21:10:36 +00002953ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002954{
2955 expr_ty context_expr, optional_vars = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002956
Georg Brandl0c315622009-05-25 21:10:36 +00002957 REQ(n, with_item);
2958 context_expr = ast_for_expr(c, CHILD(n, 0));
2959 if (NCH(n) == 3) {
2960 optional_vars = ast_for_expr(c, CHILD(n, 2));
Guido van Rossumc2e20742006-02-27 22:32:47 +00002961
2962 if (!optional_vars) {
2963 return NULL;
2964 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002965 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002966 return NULL;
2967 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002968 }
2969
Georg Brandl0c315622009-05-25 21:10:36 +00002970 return With(context_expr, optional_vars, content, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002971 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002972}
2973
Georg Brandl0c315622009-05-25 21:10:36 +00002974/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
2975static stmt_ty
2976ast_for_with_stmt(struct compiling *c, const node *n)
2977{
2978 int i;
2979 stmt_ty ret;
2980 asdl_seq *inner;
2981
2982 REQ(n, with_stmt);
2983
2984 /* process the with items inside-out */
2985 i = NCH(n) - 1;
2986 /* the suite of the innermost with item is the suite of the with stmt */
2987 inner = ast_for_suite(c, CHILD(n, i));
2988 if (!inner)
2989 return NULL;
2990
2991 for (;;) {
2992 i -= 2;
2993 ret = ast_for_with_item(c, CHILD(n, i), inner);
2994 if (!ret)
2995 return NULL;
2996 /* was this the last item? */
2997 if (i == 1)
2998 break;
2999 /* if not, wrap the result so far in a new sequence */
3000 inner = asdl_seq_new(1, c->c_arena);
3001 if (!inner)
3002 return NULL;
3003 asdl_seq_SET(inner, 0, ret);
3004 }
3005
3006 return ret;
3007}
3008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003009static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003010ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003012 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003013 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003014 asdl_seq *s;
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003015 expr_ty call;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003016
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017 REQ(n, classdef);
3018
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003019 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 s = ast_for_suite(c, CHILD(n, 3));
3021 if (!s)
3022 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003023 classname = NEW_IDENTIFIER(CHILD(n, 1));
3024 if (!classname)
3025 return NULL;
3026 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3027 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029
3030 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003031 s = ast_for_suite(c, CHILD(n,5));
3032 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003033 return NULL;
3034 classname = NEW_IDENTIFIER(CHILD(n, 1));
3035 if (!classname)
3036 return NULL;
3037 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3038 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 }
3040
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003041 /* class NAME '(' arglist ')' ':' suite */
3042 /* build up a fake Call node so we can extract its pieces */
Benjamin Petersond951e7b2008-11-25 22:19:53 +00003043 {
3044 PyObject *dummy_name;
3045 expr_ty dummy;
3046 dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
3047 if (!dummy_name)
3048 return NULL;
3049 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
3050 call = ast_for_call(c, CHILD(n, 3), dummy);
3051 if (!call)
3052 return NULL;
3053 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003055 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003057 classname = NEW_IDENTIFIER(CHILD(n, 1));
3058 if (!classname)
3059 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003060
Benjamin Peterson30760062008-11-25 04:02:28 +00003061 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003062 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003063 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064}
3065
3066static stmt_ty
3067ast_for_stmt(struct compiling *c, const node *n)
3068{
3069 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 assert(NCH(n) == 1);
3071 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 }
3073 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003074 assert(num_stmts(n) == 1);
3075 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076 }
3077 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003078 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003079 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3080 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003081 */
3082 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 case expr_stmt:
3084 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 case del_stmt:
3086 return ast_for_del_stmt(c, n);
3087 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003088 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 case flow_stmt:
3090 return ast_for_flow_stmt(c, n);
3091 case import_stmt:
3092 return ast_for_import_stmt(c, n);
3093 case global_stmt:
3094 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003095 case nonlocal_stmt:
3096 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097 case assert_stmt:
3098 return ast_for_assert_stmt(c, n);
3099 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003100 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3102 TYPE(n), NCH(n));
3103 return NULL;
3104 }
3105 }
3106 else {
3107 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003108 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 */
3110 node *ch = CHILD(n, 0);
3111 REQ(n, compound_stmt);
3112 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 case if_stmt:
3114 return ast_for_if_stmt(c, ch);
3115 case while_stmt:
3116 return ast_for_while_stmt(c, ch);
3117 case for_stmt:
3118 return ast_for_for_stmt(c, ch);
3119 case try_stmt:
3120 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003121 case with_stmt:
3122 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003124 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003126 return ast_for_classdef(c, ch, NULL);
3127 case decorated:
3128 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003130 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3132 TYPE(n), NCH(n));
3133 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003134 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135 }
3136}
3137
3138static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003139parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003141 const char *end;
3142 long x;
3143 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003145 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003146 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147#endif
3148
Mark Dickinsond3c827b2008-12-05 18:10:46 +00003149 assert(s != NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003150 errno = 0;
3151 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003153 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 if (s[0] == '0') {
3156 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3157 if (x < 0 && errno == 0) {
3158 return PyLong_FromString((char *)s,
3159 (char **)0,
3160 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003161 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 }
3163 else
3164 x = PyOS_strtol((char *)s, (char **)&end, 0);
3165 if (*end == '\0') {
3166 if (errno != 0)
3167 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003168 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 }
3170 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003173 compl.real = 0.;
Mark Dickinson725bfd82009-05-03 20:33:40 +00003174 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3175 if (compl.imag == -1.0 && PyErr_Occurred())
3176 return NULL;
3177 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 }
3179 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 {
Mark Dickinson725bfd82009-05-03 20:33:40 +00003182 dx = PyOS_string_to_double(s, NULL, NULL);
3183 if (dx == -1.0 && PyErr_Occurred())
3184 return NULL;
3185 return PyFloat_FromDouble(dx);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003186 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187}
3188
3189static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003190decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003192 PyObject *u, *v;
3193 char *s, *t;
3194 t = s = (char *)*sPtr;
3195 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3196 while (s < end && (*s & 0x80)) s++;
3197 *sPtr = s;
3198 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3199 if (u == NULL)
3200 return NULL;
3201 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3202 Py_DECREF(u);
3203 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204}
3205
3206static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003207decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003208{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003209 PyObject *v, *u;
3210 char *buf;
3211 char *p;
3212 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003213
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 if (encoding == NULL) {
3215 buf = (char *)s;
3216 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003217 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003218 /* check for integer overflow */
3219 if (len > PY_SIZE_MAX / 4)
3220 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003222 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 if (u == NULL)
3224 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003225 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 end = s + len;
3227 while (s < end) {
3228 if (*s == '\\') {
3229 *p++ = *s++;
3230 if (*s & 0x80) {
3231 strcpy(p, "u005c");
3232 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003233 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003234 }
3235 if (*s & 0x80) { /* XXX inefficient */
3236 PyObject *w;
3237 char *r;
3238 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003239 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 if (w == NULL) {
3241 Py_DECREF(u);
3242 return NULL;
3243 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003244 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003245 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003246 assert(rn % 2 == 0);
3247 for (i = 0; i < rn; i += 2) {
3248 sprintf(p, "\\u%02x%02x",
3249 r[i + 0] & 0xFF,
3250 r[i + 1] & 0xFF);
3251 p += 6;
3252 }
3253 Py_DECREF(w);
3254 } else {
3255 *p++ = *s++;
3256 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003257 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003258 len = p - buf;
3259 s = buf;
3260 }
3261 if (rawmode)
3262 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3263 else
3264 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3265 Py_XDECREF(u);
3266 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}
3268
3269/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003270 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 * parsestr parses it, and returns the decoded Python string object.
3272 */
3273static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003274parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 size_t len;
3277 const char *s = STR(n);
3278 int quote = Py_CHARMASK(*s);
3279 int rawmode = 0;
3280 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003281 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003282 if (quote == 'b' || quote == 'B') {
3283 quote = *++s;
3284 *bytesmode = 1;
3285 }
3286 if (quote == 'r' || quote == 'R') {
3287 quote = *++s;
3288 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003289 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003290 }
3291 if (quote != '\'' && quote != '\"') {
3292 PyErr_BadInternalCall();
3293 return NULL;
3294 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003295 s++;
3296 len = strlen(s);
3297 if (len > INT_MAX) {
3298 PyErr_SetString(PyExc_OverflowError,
3299 "string to parse is too long");
3300 return NULL;
3301 }
3302 if (s[--len] != quote) {
3303 PyErr_BadInternalCall();
3304 return NULL;
3305 }
3306 if (len >= 4 && s[0] == quote && s[1] == quote) {
3307 s += 2;
3308 len -= 2;
3309 if (s[--len] != quote || s[--len] != quote) {
3310 PyErr_BadInternalCall();
3311 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003312 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003314 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003315 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003316 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 if (*bytesmode) {
3318 /* Disallow non-ascii characters (but not escapes) */
3319 const char *c;
3320 for (c = s; *c; c++) {
3321 if (Py_CHARMASK(*c) >= 0x80) {
3322 ast_error(n, "bytes can only contain ASCII "
3323 "literal characters.");
3324 return NULL;
3325 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003326 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003327 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003328 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003329 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003330 if (rawmode || strchr(s, '\\') == NULL) {
3331 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003332 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003333 if (u == NULL || !*bytesmode)
3334 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003335 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003336 Py_DECREF(u);
3337 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003338 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003339 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003340 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003341 return PyUnicode_FromStringAndSize(s, len);
3342 } else {
3343 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003344 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003345 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003346 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003347 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003348}
3349
Guido van Rossum29fd7122007-11-12 01:13:56 +00003350/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351 * compile-time literal catenation, calling parsestr() on each piece, and
3352 * pasting the intermediate results together.
3353 */
3354static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003355parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003357 PyObject *v;
3358 int i;
3359 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003360 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003361 if (v != NULL) {
3362 /* String literal concatenation */
3363 for (i = 1; i < NCH(n); i++) {
3364 PyObject *s;
3365 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003366 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003367 if (s == NULL)
3368 goto onError;
3369 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003370 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003371 goto onError;
3372 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003373 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3374 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003375 if (v == NULL)
3376 goto onError;
3377 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003378 else {
3379 PyObject *temp = PyUnicode_Concat(v, s);
3380 Py_DECREF(s);
3381 Py_DECREF(v);
3382 v = temp;
3383 if (v == NULL)
3384 goto onError;
3385 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003386 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003387 }
3388 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389
Guido van Rossumd8faa362007-04-27 19:54:29 +00003390 onError:
3391 Py_XDECREF(v);
3392 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393}