blob: 9af7d221ec4882d1e8c918ffa75a3ab7bd5497ba [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);
Benjamin Peterson30760062008-11-25 04:02:28 +000054 if (!id)
55 return NULL;
Martin v. Löwis47383402007-08-15 07:32:56 +000056 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
57 /* Check whether there are non-ASCII characters in the
58 identifier; if so, normalize to NFKC. */
59 for (; *u; u++) {
60 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000061 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000062 PyObject *id2;
63 if (!m)
64 return NULL;
65 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
66 Py_DECREF(m);
67 if (!id2)
68 return NULL;
69 Py_DECREF(id);
70 id = id2;
71 break;
72 }
73 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000074 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000075 PyArena_AddPyObject(arena, id);
76 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077}
78
Neal Norwitzadb69fc2005-12-17 20:54:49 +000079#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000080
81/* This routine provides an invalid object for the syntax error.
82 The outermost routine must unpack this error and create the
83 proper object. We do this so that we don't have to pass
84 the filename to everything function.
85
86 XXX Maybe we should just pass the filename...
87*/
88
89static int
90ast_error(const node *n, const char *errstr)
91{
92 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
93 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000094 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 PyErr_SetObject(PyExc_SyntaxError, u);
96 Py_DECREF(u);
97 return 0;
98}
99
100static void
101ast_error_finish(const char *filename)
102{
103 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105
106 assert(PyErr_Occurred());
107 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000108 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109
110 PyErr_Fetch(&type, &value, &tback);
111 errstr = PyTuple_GetItem(value, 0);
112 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000113 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000115 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000116 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000117 Py_DECREF(errstr);
118 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000119 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000120 Py_DECREF(value);
121
122 loc = PyErr_ProgramText(filename, lineno);
123 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000124 Py_INCREF(Py_None);
125 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000127 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000129 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000130 Py_DECREF(errstr);
131 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000132 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000133 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000134 Py_DECREF(errstr);
135 Py_DECREF(tmp);
136 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000137 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000138 PyErr_Restore(type, value, tback);
139}
140
141/* num_stmts() returns number of contained statements.
142
143 Use this routine to determine how big a sequence is needed for
144 the statements in a parse tree. Its raison d'etre is this bit of
145 grammar:
146
147 stmt: simple_stmt | compound_stmt
148 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
149
150 A simple_stmt can contain multiple small_stmt elements joined
151 by semicolons. If the arg is a simple_stmt, the number of
152 small_stmt elements is returned.
153*/
154
155static int
156num_stmts(const node *n)
157{
158 int i, l;
159 node *ch;
160
161 switch (TYPE(n)) {
162 case single_input:
163 if (TYPE(CHILD(n, 0)) == NEWLINE)
164 return 0;
165 else
166 return num_stmts(CHILD(n, 0));
167 case file_input:
168 l = 0;
169 for (i = 0; i < NCH(n); i++) {
170 ch = CHILD(n, i);
171 if (TYPE(ch) == stmt)
172 l += num_stmts(ch);
173 }
174 return l;
175 case stmt:
176 return num_stmts(CHILD(n, 0));
177 case compound_stmt:
178 return 1;
179 case simple_stmt:
180 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
181 case suite:
182 if (NCH(n) == 1)
183 return num_stmts(CHILD(n, 0));
184 else {
185 l = 0;
186 for (i = 2; i < (NCH(n) - 1); i++)
187 l += num_stmts(CHILD(n, i));
188 return l;
189 }
190 default: {
191 char buf[128];
192
193 sprintf(buf, "Non-statement found: %d %d\n",
194 TYPE(n), NCH(n));
195 Py_FatalError(buf);
196 }
197 }
198 assert(0);
199 return 0;
200}
201
202/* Transform the CST rooted at node * to the appropriate AST
203*/
204
205mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000206PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
207 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000209 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 asdl_seq *stmts = NULL;
211 stmt_ty s;
212 node *ch;
213 struct compiling c;
214
215 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000216 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000217 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000218#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000219 ast_error(n, "encoding declaration in Unicode string");
220 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000221#endif
222 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000223 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000224 } else if (TYPE(n) == encoding_decl) {
225 c.c_encoding = STR(n);
226 n = CHILD(n, 0);
227 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000228 /* PEP 3120 */
229 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000231 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000232 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233
Jeremy Hyltona8293132006-02-28 17:58:27 +0000234 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 switch (TYPE(n)) {
236 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000237 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000239 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000240 for (i = 0; i < NCH(n) - 1; i++) {
241 ch = CHILD(n, i);
242 if (TYPE(ch) == NEWLINE)
243 continue;
244 REQ(ch, stmt);
245 num = num_stmts(ch);
246 if (num == 1) {
247 s = ast_for_stmt(&c, ch);
248 if (!s)
249 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000250 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251 }
252 else {
253 ch = CHILD(ch, 0);
254 REQ(ch, simple_stmt);
255 for (j = 0; j < num; j++) {
256 s = ast_for_stmt(&c, CHILD(ch, j * 2));
257 if (!s)
258 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000259 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260 }
261 }
262 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000263 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 case eval_input: {
265 expr_ty testlist_ast;
266
Nick Coghlan650f0d02007-04-15 12:05:43 +0000267 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000268 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000269 if (!testlist_ast)
270 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000271 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000272 }
273 case single_input:
274 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000275 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000276 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000277 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000278 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
279 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000280 if (!asdl_seq_GET(stmts, 0))
281 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000282 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000283 }
284 else {
285 n = CHILD(n, 0);
286 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000287 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000289 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000291 s = ast_for_stmt(&c, n);
292 if (!s)
293 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294 asdl_seq_SET(stmts, 0, s);
295 }
296 else {
297 /* Only a simple_stmt can contain multiple statements. */
298 REQ(n, simple_stmt);
299 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000300 if (TYPE(CHILD(n, i)) == NEWLINE)
301 break;
302 s = ast_for_stmt(&c, CHILD(n, i));
303 if (!s)
304 goto error;
305 asdl_seq_SET(stmts, i / 2, s);
306 }
307 }
308
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000309 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000310 }
311 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000312 PyErr_Format(PyExc_SystemError,
313 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314 goto error;
315 }
316 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000317 ast_error_finish(filename);
318 return NULL;
319}
320
321/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
322*/
323
324static operator_ty
325get_operator(const node *n)
326{
327 switch (TYPE(n)) {
328 case VBAR:
329 return BitOr;
330 case CIRCUMFLEX:
331 return BitXor;
332 case AMPER:
333 return BitAnd;
334 case LEFTSHIFT:
335 return LShift;
336 case RIGHTSHIFT:
337 return RShift;
338 case PLUS:
339 return Add;
340 case MINUS:
341 return Sub;
342 case STAR:
343 return Mult;
344 case SLASH:
345 return Div;
346 case DOUBLESLASH:
347 return FloorDiv;
348 case PERCENT:
349 return Mod;
350 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 }
353}
354
Guido van Rossume7ba4952007-06-06 23:52:48 +0000355static const char* FORBIDDEN[] = {
356 "None",
357 "True",
358 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000359 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000360 NULL,
361};
362
363static int
364forbidden_name(expr_ty e, const node *n)
365{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000367 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000368 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000369 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000370 ast_error(n, "assignment to keyword");
371 return 1;
372 }
373 }
374 return 0;
375}
376
Jeremy Hyltona8293132006-02-28 17:58:27 +0000377/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000378
379 Only sets context for expr kinds that "can appear in assignment context"
380 (according to ../Parser/Python.asdl). For other expr kinds, it sets
381 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382*/
383
384static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000385set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000386{
387 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 /* If a particular expression type can't be used for assign / delete,
389 set expr_name to its name and an error message will be generated.
390 */
391 const char* expr_name = NULL;
392
393 /* The ast defines augmented store and load contexts, but the
394 implementation here doesn't actually use them. The code may be
395 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000397 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000398 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 */
400 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000401
402 switch (e->kind) {
403 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Attribute.ctx = ctx;
405 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000406 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000407 e->v.Subscript.ctx = ctx;
408 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000409 case Starred_kind:
410 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000411 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000412 return 0;
413 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000414 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000415 if (ctx == Store) {
416 if (forbidden_name(e, n))
417 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 }
419 e->v.Name.ctx = ctx;
420 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000422 e->v.List.ctx = ctx;
423 s = e->v.List.elts;
424 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425 case Tuple_kind:
426 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
427 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000428 e->v.Tuple.ctx = ctx;
429 s = e->v.Tuple.elts;
430 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000431 case Lambda_kind:
432 expr_name = "lambda";
433 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000435 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000436 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000437 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000438 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000439 case UnaryOp_kind:
440 expr_name = "operator";
441 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000443 expr_name = "generator expression";
444 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000445 case Yield_kind:
446 expr_name = "yield expression";
447 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000448 case ListComp_kind:
449 expr_name = "list comprehension";
450 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000451 case SetComp_kind:
452 expr_name = "set comprehension";
453 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000454 case DictComp_kind:
455 expr_name = "dict comprehension";
456 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000457 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000458 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000459 case Num_kind:
460 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000461 expr_name = "literal";
462 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000463 case Ellipsis_kind:
464 expr_name = "Ellipsis";
465 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000466 case Compare_kind:
467 expr_name = "comparison";
468 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469 case IfExp_kind:
470 expr_name = "conditional expression";
471 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000472 default:
473 PyErr_Format(PyExc_SystemError,
474 "unexpected expression in assignment %d (line %d)",
475 e->kind, e->lineno);
476 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000477 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000478 /* Check for error string set by switch */
479 if (expr_name) {
480 char buf[300];
481 PyOS_snprintf(buf, sizeof(buf),
482 "can't %s %s",
483 ctx == Store ? "assign to" : "delete",
484 expr_name);
485 return ast_error(n, buf);
486 }
487
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000489 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490 */
491 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000492 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493
Thomas Wouters89f507f2006-12-13 04:49:30 +0000494 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000495 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000496 return 0;
497 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000498 }
499 return 1;
500}
501
502static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000503ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504{
505 REQ(n, augassign);
506 n = CHILD(n, 0);
507 switch (STR(n)[0]) {
508 case '+':
509 return Add;
510 case '-':
511 return Sub;
512 case '/':
513 if (STR(n)[1] == '/')
514 return FloorDiv;
515 else
516 return Div;
517 case '%':
518 return Mod;
519 case '<':
520 return LShift;
521 case '>':
522 return RShift;
523 case '&':
524 return BitAnd;
525 case '^':
526 return BitXor;
527 case '|':
528 return BitOr;
529 case '*':
530 if (STR(n)[1] == '*')
531 return Pow;
532 else
533 return Mult;
534 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000535 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000536 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 }
538}
539
540static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000541ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000543 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 |'is' 'not'
545 */
546 REQ(n, comp_op);
547 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000548 n = CHILD(n, 0);
549 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550 case LESS:
551 return Lt;
552 case GREATER:
553 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000554 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555 return Eq;
556 case LESSEQUAL:
557 return LtE;
558 case GREATEREQUAL:
559 return GtE;
560 case NOTEQUAL:
561 return NotEq;
562 case NAME:
563 if (strcmp(STR(n), "in") == 0)
564 return In;
565 if (strcmp(STR(n), "is") == 0)
566 return Is;
567 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000568 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572 }
573 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000574 /* handle "not in" and "is not" */
575 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000576 case NAME:
577 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
578 return NotIn;
579 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
580 return IsNot;
581 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000582 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000584 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000585 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586 }
Neal Norwitz79792652005-11-14 04:25:03 +0000587 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590}
591
592static asdl_seq *
593seq_for_testlist(struct compiling *c, const node *n)
594{
595 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000596 asdl_seq *seq;
597 expr_ty expression;
598 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000599 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000601 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000602 if (!seq)
603 return NULL;
604
605 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000606 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607
608 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000609 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
612 assert(i / 2 < seq->size);
613 asdl_seq_SET(seq, i / 2, expression);
614 }
615 return seq;
616}
617
Neal Norwitzc1505362006-12-28 06:47:50 +0000618static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000619compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000620{
621 identifier name;
622 expr_ty annotation = NULL;
623 node *ch;
624
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000625 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000626 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000627 name = NEW_IDENTIFIER(ch);
628 if (!name)
629 return NULL;
630
631 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
632 annotation = ast_for_expr(c, CHILD(n, 2));
633 if (!annotation)
634 return NULL;
635 }
636
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000637 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000638#if 0
639 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
640 if (!set_context(c, result, Store, n))
641 return NULL;
642 return result;
643#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000644}
645
Guido van Rossum4f72a782006-10-27 23:31:49 +0000646/* returns -1 if failed to handle keyword only arguments
647 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000648 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000649 ^^^
650 start pointing here
651 */
652static int
653handle_keywordonly_args(struct compiling *c, const node *n, int start,
654 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
655{
656 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000657 expr_ty expression, annotation;
658 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000659 int i = start;
660 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000661
662 if (kwonlyargs == NULL) {
663 ast_error(CHILD(n, start), "named arguments must follow bare *");
664 return -1;
665 }
666 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000667 while (i < NCH(n)) {
668 ch = CHILD(n, i);
669 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000670 case vfpdef:
671 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000673 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000674 asdl_seq_SET(kwdefaults, j, expression);
675 i += 2; /* '=' and test */
676 }
677 else { /* setting NULL if no default value exists */
678 asdl_seq_SET(kwdefaults, j, NULL);
679 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000680 if (NCH(ch) == 3) {
681 /* ch is NAME ':' test */
682 annotation = ast_for_expr(c, CHILD(ch, 2));
683 if (!annotation) {
684 ast_error(ch, "expected expression");
685 goto error;
686 }
687 }
688 else {
689 annotation = NULL;
690 }
691 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000692 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000693 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000694 ast_error(ch, "expecting name");
695 goto error;
696 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000697 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000698 i += 2; /* the name and the comma */
699 break;
700 case DOUBLESTAR:
701 return i;
702 default:
703 ast_error(ch, "unexpected node");
704 goto error;
705 }
706 }
707 return i;
708 error:
709 return -1;
710}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711
Jeremy Hyltona8293132006-02-28 17:58:27 +0000712/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713
714static arguments_ty
715ast_for_arguments(struct compiling *c, const node *n)
716{
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 /* This function handles both typedargslist (function definition)
718 and varargslist (lambda definition).
719
720 parameters: '(' [typedargslist] ')'
721 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000722 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
723 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000724 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000725 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000726 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000727 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
728 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000729 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000730 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000731 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 int i, j, k, nposargs = 0, nkwonlyargs = 0;
733 int nposdefaults = 0, found_default = 0;
734 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000736 arg_ty arg;
737 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738 node *ch;
739
740 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000742 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
743 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000744 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000746 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747
Jeremy Hyltone921e022008-07-17 16:37:17 +0000748 /* First count the number of positional args & defaults. The
749 variable i is the loop index for this for loop and the next.
750 The next loop picks up where the first leaves off.
751 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 ch = CHILD(n, i);
754 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000755 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000756 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000757 if (i < NCH(n) && /* skip argument following star */
758 (TYPE(CHILD(n, i)) == tfpdef ||
759 TYPE(CHILD(n, i)) == vfpdef)) {
760 i++;
761 }
762 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000764 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000765 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000767 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000768 /* count the number of keyword only args &
769 defaults for keyword only args */
770 for ( ; i < NCH(n); ++i) {
771 ch = CHILD(n, i);
772 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000773 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000774 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
776 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778 kwonlyargs = (nkwonlyargs ?
779 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
780 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000781 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 posdefaults = (nposdefaults ?
783 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
784 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000785 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000786 /* The length of kwonlyargs and kwdefaults are same
787 since we set NULL as default for keyword only argument w/o default
788 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000789 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000790 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
791 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000792 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000793
794 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000795 ast_error(n, "more than 255 arguments");
796 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000798
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000799 /* tfpdef: NAME [':' test]
800 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 */
802 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000803 j = 0; /* index for defaults */
804 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000806 ch = CHILD(n, i);
807 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000808 case tfpdef:
809 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
811 anything other than EQUAL or a comma? */
812 /* XXX Should NCH(n) check be made a separate check? */
813 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000814 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
815 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000816 goto error;
817 assert(posdefaults != NULL);
818 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000822 else if (found_default) {
823 ast_error(n,
824 "non-default argument follows default argument");
825 goto error;
826 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000827 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000828 if (!arg)
829 goto error;
830 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831 i += 2; /* the name and the comma */
832 break;
833 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000835 ast_error(CHILD(n, i),
836 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000837 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000838 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000839 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000840 if (TYPE(ch) == COMMA) {
841 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000842 i += 2; /* now follows keyword only arguments */
843 res = handle_keywordonly_args(c, n, i,
844 kwonlyargs, kwdefaults);
845 if (res == -1) goto error;
846 i = res; /* res has new position to process */
847 }
848 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000849 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000850 if (!vararg)
851 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000853 /* there is an annotation on the vararg */
854 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000855 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000857 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
858 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000859 int res = 0;
860 res = handle_keywordonly_args(c, n, i,
861 kwonlyargs, kwdefaults);
862 if (res == -1) goto error;
863 i = res; /* res has new position to process */
864 }
865 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 break;
867 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000868 ch = CHILD(n, i+1); /* tfpdef */
869 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000870 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
871 if (NCH(ch) > 1) {
872 /* there is an annotation on the kwarg */
873 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
874 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000875 if (!kwarg)
876 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000877 i += 3;
878 break;
879 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000880 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881 "unexpected node in varargslist: %d @ %d",
882 TYPE(ch), i);
883 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000884 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000886 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
887 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000889 Py_XDECREF(vararg);
890 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891 return NULL;
892}
893
894static expr_ty
895ast_for_dotted_name(struct compiling *c, const node *n)
896{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000897 expr_ty e;
898 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000899 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000900 int i;
901
902 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000903
904 lineno = LINENO(n);
905 col_offset = n->n_col_offset;
906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000907 id = NEW_IDENTIFIER(CHILD(n, 0));
908 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000909 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000910 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000911 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000912 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913
914 for (i = 2; i < NCH(n); i+=2) {
915 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000916 if (!id)
917 return NULL;
918 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
919 if (!e)
920 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000921 }
922
923 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924}
925
926static expr_ty
927ast_for_decorator(struct compiling *c, const node *n)
928{
929 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
930 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000931 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932
933 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000934 REQ(CHILD(n, 0), AT);
935 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936
937 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
938 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000939 return NULL;
940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 d = name_expr;
943 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000944 }
945 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000946 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000947 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000948 if (!d)
949 return NULL;
950 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000951 }
952 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000953 d = ast_for_call(c, CHILD(n, 3), name_expr);
954 if (!d)
955 return NULL;
956 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 }
958
959 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000960}
961
962static asdl_seq*
963ast_for_decorators(struct compiling *c, const node *n)
964{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000965 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000966 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967 int i;
968
969 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000970 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971 if (!decorator_seq)
972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000973
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000975 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000976 if (!d)
977 return NULL;
978 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 }
980 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981}
982
983static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000984ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000986 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000987 identifier name;
988 arguments_ty args;
989 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000990 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000991 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
993 REQ(n, funcdef);
994
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 name = NEW_IDENTIFIER(CHILD(n, name_i));
996 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998 args = ast_for_arguments(c, CHILD(n, name_i + 1));
999 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001000 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001001 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1002 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1003 if (!returns)
1004 return NULL;
1005 name_i += 2;
1006 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 body = ast_for_suite(c, CHILD(n, name_i + 3));
1008 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001009 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010
Neal Norwitzc1505362006-12-28 06:47:50 +00001011 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013}
1014
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001015static stmt_ty
1016ast_for_decorated(struct compiling *c, const node *n)
1017{
1018 /* decorated: decorators (classdef | funcdef) */
1019 stmt_ty thing = NULL;
1020 asdl_seq *decorator_seq = NULL;
1021
1022 REQ(n, decorated);
1023
1024 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1025 if (!decorator_seq)
1026 return NULL;
1027
1028 assert(TYPE(CHILD(n, 1)) == funcdef ||
1029 TYPE(CHILD(n, 1)) == classdef);
1030
1031 if (TYPE(CHILD(n, 1)) == funcdef) {
1032 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1033 } else if (TYPE(CHILD(n, 1)) == classdef) {
1034 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1035 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001036 /* we count the decorators in when talking about the class' or
1037 * function's line number */
1038 if (thing) {
1039 thing->lineno = LINENO(n);
1040 thing->col_offset = n->n_col_offset;
1041 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001042 return thing;
1043}
1044
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045static expr_ty
1046ast_for_lambdef(struct compiling *c, const node *n)
1047{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001048 /* lambdef: 'lambda' [varargslist] ':' test
1049 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 arguments_ty args;
1051 expr_ty expression;
1052
1053 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001054 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1055 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 if (!args)
1057 return NULL;
1058 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001059 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001061 }
1062 else {
1063 args = ast_for_arguments(c, CHILD(n, 1));
1064 if (!args)
1065 return NULL;
1066 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001067 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069 }
1070
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001071 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001072}
1073
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001074static expr_ty
1075ast_for_ifexpr(struct compiling *c, const node *n)
1076{
1077 /* test: or_test 'if' or_test 'else' test */
1078 expr_ty expression, body, orelse;
1079
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001080 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001081 body = ast_for_expr(c, CHILD(n, 0));
1082 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001083 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001084 expression = ast_for_expr(c, CHILD(n, 2));
1085 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001086 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087 orelse = ast_for_expr(c, CHILD(n, 4));
1088 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001089 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001090 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1091 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001092}
1093
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001094/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001095 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096
Nick Coghlan650f0d02007-04-15 12:05:43 +00001097 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098*/
1099
1100static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001101count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001103 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104
Guido van Rossumd8faa362007-04-27 19:54:29 +00001105 count_comp_for:
1106 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001107 REQ(n, comp_for);
1108 if (NCH(n) == 5)
1109 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 else
1111 return n_fors;
1112 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001113 REQ(n, comp_iter);
1114 n = CHILD(n, 0);
1115 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001117 else if (TYPE(n) == comp_if) {
1118 if (NCH(n) == 3) {
1119 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001120 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001121 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 else
1123 return n_fors;
1124 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001125
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 /* Should never be reached */
1127 PyErr_SetString(PyExc_SystemError,
1128 "logic error in count_comp_fors");
1129 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130}
1131
Nick Coghlan650f0d02007-04-15 12:05:43 +00001132/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133
Nick Coghlan650f0d02007-04-15 12:05:43 +00001134 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135*/
1136
1137static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001138count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001140 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141
Guido van Rossumd8faa362007-04-27 19:54:29 +00001142 while (1) {
1143 REQ(n, comp_iter);
1144 if (TYPE(CHILD(n, 0)) == comp_for)
1145 return n_ifs;
1146 n = CHILD(n, 0);
1147 REQ(n, comp_if);
1148 n_ifs++;
1149 if (NCH(n) == 2)
1150 return n_ifs;
1151 n = CHILD(n, 2);
1152 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153}
1154
Guido van Rossum992d4a32007-07-11 13:09:30 +00001155static asdl_seq *
1156ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001159 asdl_seq *comps;
1160
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001161 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 if (n_fors == -1)
1163 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164
Nick Coghlan650f0d02007-04-15 12:05:43 +00001165 comps = asdl_seq_new(n_fors, c->c_arena);
1166 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 asdl_seq *t;
1172 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001173 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174
Guido van Rossum992d4a32007-07-11 13:09:30 +00001175 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176
Guido van Rossum992d4a32007-07-11 13:09:30 +00001177 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001178 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001181 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001184
Thomas Wouters89f507f2006-12-13 04:49:30 +00001185 /* Check the # of children rather than the length of t, since
1186 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1187 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001188 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1189 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001191 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001192 c->c_arena),
1193 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
Nick Coghlan650f0d02007-04-15 12:05:43 +00001195 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 int j, n_ifs;
1200 asdl_seq *ifs;
1201
Guido van Rossum992d4a32007-07-11 13:09:30 +00001202 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001203 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001204 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001206
1207 ifs = asdl_seq_new(n_ifs, c->c_arena);
1208 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001210
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 REQ(n, comp_iter);
1213 n = CHILD(n, 0);
1214 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215
Guido van Rossum992d4a32007-07-11 13:09:30 +00001216 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001218 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001219 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001220 if (NCH(n) == 3)
1221 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001223 /* on exit, must guarantee that n is a comp_for */
1224 if (TYPE(n) == comp_iter)
1225 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001226 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001228 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001230 return comps;
1231}
1232
1233static expr_ty
1234ast_for_itercomp(struct compiling *c, const node *n, int type)
1235{
1236 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1237 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1238 expr_ty elt;
1239 asdl_seq *comps;
1240
1241 assert(NCH(n) > 1);
1242
1243 elt = ast_for_expr(c, CHILD(n, 0));
1244 if (!elt)
1245 return NULL;
1246
1247 comps = ast_for_comprehension(c, CHILD(n, 1));
1248 if (!comps)
1249 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001250
1251 if (type == COMP_GENEXP)
1252 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1253 else if (type == COMP_LISTCOMP)
1254 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1255 else if (type == COMP_SETCOMP)
1256 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1257 else
1258 /* Should never happen */
1259 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260}
1261
1262static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001263ast_for_dictcomp(struct compiling *c, const node *n)
1264{
1265 expr_ty key, value;
1266 asdl_seq *comps;
1267
1268 assert(NCH(n) > 3);
1269 REQ(CHILD(n, 1), COLON);
1270
1271 key = ast_for_expr(c, CHILD(n, 0));
1272 if (!key)
1273 return NULL;
1274
1275 value = ast_for_expr(c, CHILD(n, 2));
1276 if (!value)
1277 return NULL;
1278
1279 comps = ast_for_comprehension(c, CHILD(n, 3));
1280 if (!comps)
1281 return NULL;
1282
1283 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1284}
1285
1286static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001287ast_for_genexp(struct compiling *c, const node *n)
1288{
1289 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001290 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001291}
1292
1293static expr_ty
1294ast_for_listcomp(struct compiling *c, const node *n)
1295{
1296 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001297 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001298}
1299
1300static expr_ty
1301ast_for_setcomp(struct compiling *c, const node *n)
1302{
1303 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001304 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001305}
1306
1307
1308static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309ast_for_atom(struct compiling *c, const node *n)
1310{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001311 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1312 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001313 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 */
1315 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001316 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001317
1318 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001319 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001320 /* All names start in Load context, but may later be
1321 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001322 PyObject *name = NEW_IDENTIFIER(ch);
1323 if (!name)
1324 return NULL;
1325 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001328 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001329 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001330 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001331 PyObject *type, *value, *tback, *errstr;
1332 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001333 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001334 if (errstr) {
1335 char *s = "";
1336 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001337 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001338 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1339 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001340 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001341 } else {
1342 ast_error(n, "(unicode error) unknown error");
1343 }
1344 Py_DECREF(type);
1345 Py_DECREF(value);
1346 Py_XDECREF(tback);
1347 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001348 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001349 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001350 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001351 if (bytesmode)
1352 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1353 else
1354 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 }
1356 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001357 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 if (!pynum)
1359 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001360
Thomas Wouters89f507f2006-12-13 04:49:30 +00001361 PyArena_AddPyObject(c->c_arena, pynum);
1362 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 }
Georg Brandldde00282007-03-18 19:01:53 +00001364 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001365 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001367 ch = CHILD(n, 1);
1368
1369 if (TYPE(ch) == RPAR)
1370 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1371
1372 if (TYPE(ch) == yield_expr)
1373 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001374
1375 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1376 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001377 return ast_for_genexp(c, ch);
1378
Nick Coghlan650f0d02007-04-15 12:05:43 +00001379 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001381 ch = CHILD(n, 1);
1382
1383 if (TYPE(ch) == RSQB)
1384 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1385
Nick Coghlan650f0d02007-04-15 12:05:43 +00001386 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1388 asdl_seq *elts = seq_for_testlist(c, ch);
1389 if (!elts)
1390 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001391
Thomas Wouters89f507f2006-12-13 04:49:30 +00001392 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1393 }
1394 else
1395 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001397 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1398 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001399 int i, size;
1400 asdl_seq *keys, *values;
1401
1402 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403 if (TYPE(ch) == RBRACE) {
1404 /* it's an empty dict */
1405 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1406 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1407 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001408 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001409 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001410 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001411 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001412 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001413 for (i = 0; i < NCH(ch); i += 2) {
1414 expr_ty expression;
1415 expression = ast_for_expr(c, CHILD(ch, i));
1416 if (!expression)
1417 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001418 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001419 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001420 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1421 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1422 /* it's a set comprehension */
1423 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001424 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1425 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001426 } else {
1427 /* it's a dict */
1428 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1429 keys = asdl_seq_new(size, c->c_arena);
1430 if (!keys)
1431 return NULL;
1432
1433 values = asdl_seq_new(size, c->c_arena);
1434 if (!values)
1435 return NULL;
1436
1437 for (i = 0; i < NCH(ch); i += 4) {
1438 expr_ty expression;
1439
1440 expression = ast_for_expr(c, CHILD(ch, i));
1441 if (!expression)
1442 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001443
Guido van Rossum86e58e22006-08-28 15:27:34 +00001444 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001445
Guido van Rossum86e58e22006-08-28 15:27:34 +00001446 expression = ast_for_expr(c, CHILD(ch, i + 2));
1447 if (!expression)
1448 return NULL;
1449
1450 asdl_seq_SET(values, i / 4, expression);
1451 }
1452 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1453 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001456 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1457 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 }
1459}
1460
1461static slice_ty
1462ast_for_slice(struct compiling *c, const node *n)
1463{
1464 node *ch;
1465 expr_ty lower = NULL, upper = NULL, step = NULL;
1466
1467 REQ(n, subscript);
1468
1469 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001470 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 sliceop: ':' [test]
1472 */
1473 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 if (NCH(n) == 1 && TYPE(ch) == test) {
1475 /* 'step' variable hold no significance in terms of being used over
1476 other vars */
1477 step = ast_for_expr(c, ch);
1478 if (!step)
1479 return NULL;
1480
Thomas Wouters89f507f2006-12-13 04:49:30 +00001481 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482 }
1483
1484 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486 if (!lower)
1487 return NULL;
1488 }
1489
1490 /* If there's an upper bound it's in the second or third position. */
1491 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 if (NCH(n) > 1) {
1493 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (TYPE(n2) == test) {
1496 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 if (!upper)
1498 return NULL;
1499 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001502 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001503
Thomas Wouters89f507f2006-12-13 04:49:30 +00001504 if (TYPE(n2) == test) {
1505 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506 if (!upper)
1507 return NULL;
1508 }
1509 }
1510
1511 ch = CHILD(n, NCH(n) - 1);
1512 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001513 if (NCH(ch) == 1) {
1514 /* No expression, so step is None */
1515 ch = CHILD(ch, 0);
1516 step = Name(new_identifier("None", c->c_arena), Load,
1517 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 if (!step)
1519 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001520 } else {
1521 ch = CHILD(ch, 1);
1522 if (TYPE(ch) == test) {
1523 step = ast_for_expr(c, ch);
1524 if (!step)
1525 return NULL;
1526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527 }
1528 }
1529
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001530 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531}
1532
1533static expr_ty
1534ast_for_binop(struct compiling *c, const node *n)
1535{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536 /* Must account for a sequence of expressions.
1537 How should A op B op C by represented?
1538 BinOp(BinOp(A, op, B), op, C).
1539 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001540
Guido van Rossumd8faa362007-04-27 19:54:29 +00001541 int i, nops;
1542 expr_ty expr1, expr2, result;
1543 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544
Guido van Rossumd8faa362007-04-27 19:54:29 +00001545 expr1 = ast_for_expr(c, CHILD(n, 0));
1546 if (!expr1)
1547 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548
Guido van Rossumd8faa362007-04-27 19:54:29 +00001549 expr2 = ast_for_expr(c, CHILD(n, 2));
1550 if (!expr2)
1551 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552
Guido van Rossumd8faa362007-04-27 19:54:29 +00001553 newoperator = get_operator(CHILD(n, 1));
1554 if (!newoperator)
1555 return NULL;
1556
1557 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1558 c->c_arena);
1559 if (!result)
1560 return NULL;
1561
1562 nops = (NCH(n) - 1) / 2;
1563 for (i = 1; i < nops; i++) {
1564 expr_ty tmp_result, tmp;
1565 const node* next_oper = CHILD(n, i * 2 + 1);
1566
1567 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001568 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569 return NULL;
1570
Guido van Rossumd8faa362007-04-27 19:54:29 +00001571 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1572 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573 return NULL;
1574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 tmp_result = BinOp(result, newoperator, tmp,
1576 LINENO(next_oper), next_oper->n_col_offset,
1577 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001578 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001579 return NULL;
1580 result = tmp_result;
1581 }
1582 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583}
1584
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001585static expr_ty
1586ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1587{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001588 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1589 subscriptlist: subscript (',' subscript)* [',']
1590 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1591 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001592 REQ(n, trailer);
1593 if (TYPE(CHILD(n, 0)) == LPAR) {
1594 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001595 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1596 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001598 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001599 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001600 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001601 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1602 if (!attr_id)
1603 return NULL;
1604 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001605 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001606 }
1607 else {
1608 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 REQ(CHILD(n, 2), RSQB);
1610 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001611 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001612 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1613 if (!slc)
1614 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001615 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1616 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617 }
1618 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001619 /* The grammar is ambiguous here. The ambiguity is resolved
1620 by treating the sequence as a tuple literal if there are
1621 no slice features.
1622 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001623 int j;
1624 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001625 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001626 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 asdl_seq *slices, *elts;
1628 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001629 if (!slices)
1630 return NULL;
1631 for (j = 0; j < NCH(n); j += 2) {
1632 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001633 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001634 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001635 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001636 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 asdl_seq_SET(slices, j / 2, slc);
1638 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001639 if (!simple) {
1640 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001641 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001642 }
1643 /* extract Index values and put them in a Tuple */
1644 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001645 if (!elts)
1646 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001647 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1648 slc = (slice_ty)asdl_seq_GET(slices, j);
1649 assert(slc->kind == Index_kind && slc->v.Index.value);
1650 asdl_seq_SET(elts, j, slc->v.Index.value);
1651 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001652 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001653 if (!e)
1654 return NULL;
1655 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001656 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001657 }
1658 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001659}
1660
1661static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001662ast_for_factor(struct compiling *c, const node *n)
1663{
1664 node *pfactor, *ppower, *patom, *pnum;
1665 expr_ty expression;
1666
1667 /* If the unary - operator is applied to a constant, don't generate
1668 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1669 constant. The peephole optimizer already does something like
1670 this but it doesn't handle the case where the constant is
1671 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1672 PyLongObject.
1673 */
1674 if (TYPE(CHILD(n, 0)) == MINUS
1675 && NCH(n) == 2
1676 && TYPE((pfactor = CHILD(n, 1))) == factor
1677 && NCH(pfactor) == 1
1678 && TYPE((ppower = CHILD(pfactor, 0))) == power
1679 && NCH(ppower) == 1
1680 && TYPE((patom = CHILD(ppower, 0))) == atom
1681 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1682 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1683 if (s == NULL)
1684 return NULL;
1685 s[0] = '-';
1686 strcpy(s + 1, STR(pnum));
1687 PyObject_FREE(STR(pnum));
1688 STR(pnum) = s;
1689 return ast_for_atom(c, patom);
1690 }
1691
1692 expression = ast_for_expr(c, CHILD(n, 1));
1693 if (!expression)
1694 return NULL;
1695
1696 switch (TYPE(CHILD(n, 0))) {
1697 case PLUS:
1698 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1699 c->c_arena);
1700 case MINUS:
1701 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1702 c->c_arena);
1703 case TILDE:
1704 return UnaryOp(Invert, expression, LINENO(n),
1705 n->n_col_offset, c->c_arena);
1706 }
1707 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1708 TYPE(CHILD(n, 0)));
1709 return NULL;
1710}
1711
1712static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001713ast_for_power(struct compiling *c, const node *n)
1714{
1715 /* power: atom trailer* ('**' factor)*
1716 */
1717 int i;
1718 expr_ty e, tmp;
1719 REQ(n, power);
1720 e = ast_for_atom(c, CHILD(n, 0));
1721 if (!e)
1722 return NULL;
1723 if (NCH(n) == 1)
1724 return e;
1725 for (i = 1; i < NCH(n); i++) {
1726 node *ch = CHILD(n, i);
1727 if (TYPE(ch) != trailer)
1728 break;
1729 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001730 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001731 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001732 tmp->lineno = e->lineno;
1733 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001734 e = tmp;
1735 }
1736 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1737 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001738 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001739 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001740 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001741 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001742 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001743 e = tmp;
1744 }
1745 return e;
1746}
1747
Guido van Rossum0368b722007-05-11 16:50:42 +00001748static expr_ty
1749ast_for_starred(struct compiling *c, const node *n)
1750{
1751 expr_ty tmp;
1752 REQ(n, star_expr);
1753
1754 tmp = ast_for_expr(c, CHILD(n, 1));
1755 if (!tmp)
1756 return NULL;
1757
1758 /* The Load context is changed later. */
1759 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1760}
1761
1762
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763/* Do not name a variable 'expr'! Will cause a compile error.
1764*/
1765
1766static expr_ty
1767ast_for_expr(struct compiling *c, const node *n)
1768{
1769 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001770 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001771 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001772 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 and_test: not_test ('and' not_test)*
1774 not_test: 'not' not_test | comparison
1775 comparison: expr (comp_op expr)*
1776 expr: xor_expr ('|' xor_expr)*
1777 xor_expr: and_expr ('^' and_expr)*
1778 and_expr: shift_expr ('&' shift_expr)*
1779 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1780 arith_expr: term (('+'|'-') term)*
1781 term: factor (('*'|'/'|'%'|'//') factor)*
1782 factor: ('+'|'-'|'~') factor | power
1783 power: atom trailer* ('**' factor)*
1784 */
1785
1786 asdl_seq *seq;
1787 int i;
1788
1789 loop:
1790 switch (TYPE(n)) {
1791 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001792 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001793 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001794 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001796 else if (NCH(n) > 1)
1797 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001798 /* Fallthrough */
1799 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 case and_test:
1801 if (NCH(n) == 1) {
1802 n = CHILD(n, 0);
1803 goto loop;
1804 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001805 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 if (!seq)
1807 return NULL;
1808 for (i = 0; i < NCH(n); i += 2) {
1809 expr_ty e = ast_for_expr(c, CHILD(n, i));
1810 if (!e)
1811 return NULL;
1812 asdl_seq_SET(seq, i / 2, e);
1813 }
1814 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1816 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001817 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001818 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 case not_test:
1820 if (NCH(n) == 1) {
1821 n = CHILD(n, 0);
1822 goto loop;
1823 }
1824 else {
1825 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1826 if (!expression)
1827 return NULL;
1828
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1830 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831 }
1832 case comparison:
1833 if (NCH(n) == 1) {
1834 n = CHILD(n, 0);
1835 goto loop;
1836 }
1837 else {
1838 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001840 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 if (!ops)
1843 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001844 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 return NULL;
1847 }
1848 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001851 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855
1856 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001857 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001859 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001861 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001862 asdl_seq_SET(cmps, i / 2, expression);
1863 }
1864 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001865 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001867 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 return Compare(expression, ops, cmps, LINENO(n),
1870 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 }
1872 break;
1873
Guido van Rossum0368b722007-05-11 16:50:42 +00001874 case star_expr:
1875 if (TYPE(CHILD(n, 0)) == STAR) {
1876 return ast_for_starred(c, n);
1877 }
1878 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 /* The next five cases all handle BinOps. The main body of code
1880 is the same in each case, but the switch turned inside out to
1881 reuse the code for each type of operator.
1882 */
1883 case expr:
1884 case xor_expr:
1885 case and_expr:
1886 case shift_expr:
1887 case arith_expr:
1888 case term:
1889 if (NCH(n) == 1) {
1890 n = CHILD(n, 0);
1891 goto loop;
1892 }
1893 return ast_for_binop(c, n);
1894 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 expr_ty exp = NULL;
1896 if (NCH(n) == 2) {
1897 exp = ast_for_testlist(c, CHILD(n, 1));
1898 if (!exp)
1899 return NULL;
1900 }
1901 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1902 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001903 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 if (NCH(n) == 1) {
1905 n = CHILD(n, 0);
1906 goto loop;
1907 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001908 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001909 case power:
1910 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001912 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 return NULL;
1914 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001915 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916 return NULL;
1917}
1918
1919static expr_ty
1920ast_for_call(struct compiling *c, const node *n, expr_ty func)
1921{
1922 /*
1923 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1924 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001925 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001926 */
1927
1928 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001929 asdl_seq *args;
1930 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 expr_ty vararg = NULL, kwarg = NULL;
1932
1933 REQ(n, arglist);
1934
1935 nargs = 0;
1936 nkeywords = 0;
1937 ngens = 0;
1938 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 node *ch = CHILD(n, i);
1940 if (TYPE(ch) == argument) {
1941 if (NCH(ch) == 1)
1942 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001943 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001944 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001945 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 nkeywords++;
1947 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 }
1949 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001950 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001951 "if not sole argument");
1952 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 }
1954
1955 if (nargs + nkeywords + ngens > 255) {
1956 ast_error(n, "more than 255 arguments");
1957 return NULL;
1958 }
1959
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001962 return NULL;
1963 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001965 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966 nargs = 0;
1967 nkeywords = 0;
1968 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 node *ch = CHILD(n, i);
1970 if (TYPE(ch) == argument) {
1971 expr_ty e;
1972 if (NCH(ch) == 1) {
1973 if (nkeywords) {
1974 ast_error(CHILD(ch, 0),
1975 "non-keyword arg after keyword arg");
1976 return NULL;
1977 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001978 if (vararg) {
1979 ast_error(CHILD(ch, 0),
1980 "only named arguments may follow *expression");
1981 return NULL;
1982 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001983 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001985 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 asdl_seq_SET(args, nargs++, e);
1987 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001988 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001993 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001994 else {
1995 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001996 identifier key, tmp;
1997 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 /* CHILD(ch, 0) is test, but must be an identifier? */
2000 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002002 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003 /* f(lambda x: x[0] = 3) ends up getting parsed with
2004 * LHS test = lambda x: x[0], and RHS test = 3.
2005 * SF bug 132313 points out that complaining about a keyword
2006 * then is very confusing.
2007 */
2008 if (e->kind == Lambda_kind) {
2009 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 } else if (e->kind != Name_kind) {
2012 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002014 } else if (forbidden_name(e, ch)) {
2015 return NULL;
2016 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002017 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002018 for (k = 0; k < nkeywords; k++) {
2019 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2020 if (!PyUnicode_Compare(tmp, key)) {
2021 ast_error(CHILD(ch, 0), "keyword argument repeated");
2022 return NULL;
2023 }
2024 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002025 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002027 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 asdl_seq_SET(keywords, nkeywords++, kw);
2032 }
2033 }
2034 else if (TYPE(ch) == STAR) {
2035 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002036 if (!vararg)
2037 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 i++;
2039 }
2040 else if (TYPE(ch) == DOUBLESTAR) {
2041 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002042 if (!kwarg)
2043 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002044 i++;
2045 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 }
2047
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002048 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002049}
2050
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002052ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002054 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002055 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002056 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002058 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002059 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002060 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061 }
2062 else {
2063 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002064 TYPE(n) == testlist1);
2065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002067 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 else {
2069 asdl_seq *tmp = seq_for_testlist(c, n);
2070 if (!tmp)
2071 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002072 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002074}
2075
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076static stmt_ty
2077ast_for_expr_stmt(struct compiling *c, const node *n)
2078{
2079 REQ(n, expr_stmt);
2080 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2081 | ('=' (yield_expr|testlist))*)
2082 testlist: test (',' test)* [',']
2083 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002084 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 test: ... here starts the operator precendence dance
2086 */
2087
2088 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 if (!e)
2091 return NULL;
2092
Thomas Wouters89f507f2006-12-13 04:49:30 +00002093 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 }
2095 else if (TYPE(CHILD(n, 1)) == augassign) {
2096 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002097 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002098 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099
Thomas Wouters89f507f2006-12-13 04:49:30 +00002100 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 if (!expr1)
2102 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002103 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002104 switch (expr1->kind) {
2105 case GeneratorExp_kind:
2106 ast_error(ch, "augmented assignment to generator "
2107 "expression not possible");
2108 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002109 case Yield_kind:
2110 ast_error(ch, "augmented assignment to yield "
2111 "expression not possible");
2112 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002113 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002114 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002115 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002116 break;
2117 }
2118 case Attribute_kind:
2119 case Subscript_kind:
2120 break;
2121 default:
2122 ast_error(ch, "illegal expression for augmented "
2123 "assignment");
2124 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002126 if(!set_context(c, expr1, Store, ch))
2127 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128
Thomas Wouters89f507f2006-12-13 04:49:30 +00002129 ch = CHILD(n, 2);
2130 if (TYPE(ch) == testlist)
2131 expr2 = ast_for_testlist(c, ch);
2132 else
2133 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002134 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 return NULL;
2136
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002137 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002138 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 return NULL;
2140
Thomas Wouters89f507f2006-12-13 04:49:30 +00002141 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 }
2143 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002144 int i;
2145 asdl_seq *targets;
2146 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147 expr_ty expression;
2148
Thomas Wouters89f507f2006-12-13 04:49:30 +00002149 /* a normal assignment */
2150 REQ(CHILD(n, 1), EQUAL);
2151 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2152 if (!targets)
2153 return NULL;
2154 for (i = 0; i < NCH(n) - 2; i += 2) {
2155 expr_ty e;
2156 node *ch = CHILD(n, i);
2157 if (TYPE(ch) == yield_expr) {
2158 ast_error(ch, "assignment to yield expression not possible");
2159 return NULL;
2160 }
2161 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 /* set context to assign */
2164 if (!e)
2165 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002167 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002168 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169
Thomas Wouters89f507f2006-12-13 04:49:30 +00002170 asdl_seq_SET(targets, i / 2, e);
2171 }
2172 value = CHILD(n, NCH(n) - 1);
2173 if (TYPE(value) == testlist)
2174 expression = ast_for_testlist(c, value);
2175 else
2176 expression = ast_for_expr(c, value);
2177 if (!expression)
2178 return NULL;
2179 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181}
2182
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002184ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185{
2186 asdl_seq *seq;
2187 int i;
2188 expr_ty e;
2189
2190 REQ(n, exprlist);
2191
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002192 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002194 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002195 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002196 e = ast_for_expr(c, CHILD(n, i));
2197 if (!e)
2198 return NULL;
2199 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002200 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002201 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202 }
2203 return seq;
2204}
2205
2206static stmt_ty
2207ast_for_del_stmt(struct compiling *c, const node *n)
2208{
2209 asdl_seq *expr_list;
2210
2211 /* del_stmt: 'del' exprlist */
2212 REQ(n, del_stmt);
2213
2214 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2215 if (!expr_list)
2216 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002217 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218}
2219
2220static stmt_ty
2221ast_for_flow_stmt(struct compiling *c, const node *n)
2222{
2223 /*
2224 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2225 | yield_stmt
2226 break_stmt: 'break'
2227 continue_stmt: 'continue'
2228 return_stmt: 'return' [testlist]
2229 yield_stmt: yield_expr
2230 yield_expr: 'yield' testlist
2231 raise_stmt: 'raise' [test [',' test [',' test]]]
2232 */
2233 node *ch;
2234
2235 REQ(n, flow_stmt);
2236 ch = CHILD(n, 0);
2237 switch (TYPE(ch)) {
2238 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002239 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002241 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002243 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2244 if (!exp)
2245 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002246 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247 }
2248 case return_stmt:
2249 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002250 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002252 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002253 if (!expression)
2254 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002255 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 }
2257 case raise_stmt:
2258 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002259 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2260 else if (NCH(ch) >= 2) {
2261 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2263 if (!expression)
2264 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002265 if (NCH(ch) == 4) {
2266 cause = ast_for_expr(c, CHILD(ch, 3));
2267 if (!cause)
2268 return NULL;
2269 }
2270 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271 }
2272 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002273 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 "unexpected flow_stmt: %d", TYPE(ch));
2275 return NULL;
2276 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002277
2278 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2279 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280}
2281
2282static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002283alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284{
2285 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002286 import_as_name: NAME ['as' NAME]
2287 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 dotted_name: NAME ('.' NAME)*
2289 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002290 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 loop:
2293 switch (TYPE(n)) {
2294 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002295 str = NULL;
2296 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002297 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002298 if (!str)
2299 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002300 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002301 name = NEW_IDENTIFIER(CHILD(n, 0));
2302 if (!name)
2303 return NULL;
2304 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 case dotted_as_name:
2306 if (NCH(n) == 1) {
2307 n = CHILD(n, 0);
2308 goto loop;
2309 }
2310 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002311 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002312 if (!a)
2313 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314 assert(!a->asname);
2315 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002316 if (!a->asname)
2317 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 return a;
2319 }
2320 break;
2321 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002322 if (NCH(n) == 1) {
2323 name = NEW_IDENTIFIER(CHILD(n, 0));
2324 if (!name)
2325 return NULL;
2326 return alias(name, NULL, c->c_arena);
2327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 else {
2329 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002330 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002331 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002333 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
2335 len = 0;
2336 for (i = 0; i < NCH(n); i += 2)
2337 /* length of string plus one for the dot */
2338 len += strlen(STR(CHILD(n, i))) + 1;
2339 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002340 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 if (!str)
2342 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002343 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 if (!s)
2345 return NULL;
2346 for (i = 0; i < NCH(n); i += 2) {
2347 char *sch = STR(CHILD(n, i));
2348 strcpy(s, STR(CHILD(n, i)));
2349 s += strlen(sch);
2350 *s++ = '.';
2351 }
2352 --s;
2353 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002354 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2355 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002356 NULL);
2357 Py_DECREF(str);
2358 if (!uni)
2359 return NULL;
2360 str = uni;
2361 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002362 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002363 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 }
2365 break;
2366 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002367 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002368 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002369 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002371 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 "unexpected import name: %d", TYPE(n));
2373 return NULL;
2374 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002375
2376 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 return NULL;
2378}
2379
2380static stmt_ty
2381ast_for_import_stmt(struct compiling *c, const node *n)
2382{
2383 /*
2384 import_stmt: import_name | import_from
2385 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002386 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2387 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002389 int lineno;
2390 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 int i;
2392 asdl_seq *aliases;
2393
2394 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002395 lineno = LINENO(n);
2396 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002398 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002400 REQ(n, dotted_as_names);
2401 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2402 if (!aliases)
2403 return NULL;
2404 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002405 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002406 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002408 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002410 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002411 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002412 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 int idx, ndots = 0;
2415 alias_ty mod = NULL;
2416 identifier modname;
2417
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002418 /* Count the number of dots (for relative imports) and check for the
2419 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002420 for (idx = 1; idx < NCH(n); idx++) {
2421 if (TYPE(CHILD(n, idx)) == dotted_name) {
2422 mod = alias_for_import_name(c, CHILD(n, idx));
2423 idx++;
2424 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002425 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2426 /* three consecutive dots are tokenized as one ELLIPSIS */
2427 ndots += 3;
2428 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002429 } else if (TYPE(CHILD(n, idx)) != DOT) {
2430 break;
2431 }
2432 ndots++;
2433 }
2434 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002435 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002436 case STAR:
2437 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 n = CHILD(n, idx);
2439 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002440 break;
2441 case LPAR:
2442 /* from ... import (x, y, z) */
2443 n = CHILD(n, idx + 1);
2444 n_children = NCH(n);
2445 break;
2446 case import_as_names:
2447 /* from ... import x, y, z */
2448 n = CHILD(n, idx);
2449 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002450 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451 ast_error(n, "trailing comma not allowed without"
2452 " surrounding parentheses");
2453 return NULL;
2454 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002455 break;
2456 default:
2457 ast_error(n, "Unexpected node-type in from-import");
2458 return NULL;
2459 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460
Thomas Wouters89f507f2006-12-13 04:49:30 +00002461 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2462 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464
2465 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002466 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002467 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002468 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002472 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002474 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2475 if (!import_alias)
2476 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002477 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002480 if (mod != NULL)
2481 modname = mod->name;
2482 else
2483 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002484 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002485 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 }
Neal Norwitz79792652005-11-14 04:25:03 +00002487 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488 "unknown import statement: starts with command '%s'",
2489 STR(CHILD(n, 0)));
2490 return NULL;
2491}
2492
2493static stmt_ty
2494ast_for_global_stmt(struct compiling *c, const node *n)
2495{
2496 /* global_stmt: 'global' NAME (',' NAME)* */
2497 identifier name;
2498 asdl_seq *s;
2499 int i;
2500
2501 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002502 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002504 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002505 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002506 name = NEW_IDENTIFIER(CHILD(n, i));
2507 if (!name)
2508 return NULL;
2509 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002511 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512}
2513
2514static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002515ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2516{
2517 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2518 identifier name;
2519 asdl_seq *s;
2520 int i;
2521
2522 REQ(n, nonlocal_stmt);
2523 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2524 if (!s)
2525 return NULL;
2526 for (i = 1; i < NCH(n); i += 2) {
2527 name = NEW_IDENTIFIER(CHILD(n, i));
2528 if (!name)
2529 return NULL;
2530 asdl_seq_SET(s, i / 2, name);
2531 }
2532 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2533}
2534
2535static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536ast_for_assert_stmt(struct compiling *c, const node *n)
2537{
2538 /* assert_stmt: 'assert' test [',' test] */
2539 REQ(n, assert_stmt);
2540 if (NCH(n) == 2) {
2541 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2542 if (!expression)
2543 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002544 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 }
2546 else if (NCH(n) == 4) {
2547 expr_ty expr1, expr2;
2548
2549 expr1 = ast_for_expr(c, CHILD(n, 1));
2550 if (!expr1)
2551 return NULL;
2552 expr2 = ast_for_expr(c, CHILD(n, 3));
2553 if (!expr2)
2554 return NULL;
2555
Thomas Wouters89f507f2006-12-13 04:49:30 +00002556 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 }
Neal Norwitz79792652005-11-14 04:25:03 +00002558 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 "improper number of parts to 'assert' statement: %d",
2560 NCH(n));
2561 return NULL;
2562}
2563
2564static asdl_seq *
2565ast_for_suite(struct compiling *c, const node *n)
2566{
2567 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002568 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569 stmt_ty s;
2570 int i, total, num, end, pos = 0;
2571 node *ch;
2572
2573 REQ(n, suite);
2574
2575 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002576 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002578 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002579 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002580 n = CHILD(n, 0);
2581 /* simple_stmt always ends with a NEWLINE,
2582 and may have a trailing SEMI
2583 */
2584 end = NCH(n) - 1;
2585 if (TYPE(CHILD(n, end - 1)) == SEMI)
2586 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002587 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002588 for (i = 0; i < end; i += 2) {
2589 ch = CHILD(n, i);
2590 s = ast_for_stmt(c, ch);
2591 if (!s)
2592 return NULL;
2593 asdl_seq_SET(seq, pos++, s);
2594 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002595 }
2596 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002597 for (i = 2; i < (NCH(n) - 1); i++) {
2598 ch = CHILD(n, i);
2599 REQ(ch, stmt);
2600 num = num_stmts(ch);
2601 if (num == 1) {
2602 /* small_stmt or compound_stmt with only one child */
2603 s = ast_for_stmt(c, ch);
2604 if (!s)
2605 return NULL;
2606 asdl_seq_SET(seq, pos++, s);
2607 }
2608 else {
2609 int j;
2610 ch = CHILD(ch, 0);
2611 REQ(ch, simple_stmt);
2612 for (j = 0; j < NCH(ch); j += 2) {
2613 /* statement terminates with a semi-colon ';' */
2614 if (NCH(CHILD(ch, j)) == 0) {
2615 assert((j + 1) == NCH(ch));
2616 break;
2617 }
2618 s = ast_for_stmt(c, CHILD(ch, j));
2619 if (!s)
2620 return NULL;
2621 asdl_seq_SET(seq, pos++, s);
2622 }
2623 }
2624 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 }
2626 assert(pos == seq->size);
2627 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628}
2629
2630static stmt_ty
2631ast_for_if_stmt(struct compiling *c, const node *n)
2632{
2633 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2634 ['else' ':' suite]
2635 */
2636 char *s;
2637
2638 REQ(n, if_stmt);
2639
2640 if (NCH(n) == 4) {
2641 expr_ty expression;
2642 asdl_seq *suite_seq;
2643
2644 expression = ast_for_expr(c, CHILD(n, 1));
2645 if (!expression)
2646 return NULL;
2647 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002648 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 return NULL;
2650
Guido van Rossumd8faa362007-04-27 19:54:29 +00002651 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2652 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002654
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655 s = STR(CHILD(n, 4));
2656 /* s[2], the third character in the string, will be
2657 's' for el_s_e, or
2658 'i' for el_i_f
2659 */
2660 if (s[2] == 's') {
2661 expr_ty expression;
2662 asdl_seq *seq1, *seq2;
2663
2664 expression = ast_for_expr(c, CHILD(n, 1));
2665 if (!expression)
2666 return NULL;
2667 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002668 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669 return NULL;
2670 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002671 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002672 return NULL;
2673
Guido van Rossumd8faa362007-04-27 19:54:29 +00002674 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2675 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 }
2677 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002678 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002679 expr_ty expression;
2680 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 asdl_seq *orelse = NULL;
2682 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 /* must reference the child n_elif+1 since 'else' token is third,
2684 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002685 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2686 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2687 has_else = 1;
2688 n_elif -= 3;
2689 }
2690 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691
Thomas Wouters89f507f2006-12-13 04:49:30 +00002692 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002693 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694
Thomas Wouters89f507f2006-12-13 04:49:30 +00002695 orelse = asdl_seq_new(1, c->c_arena);
2696 if (!orelse)
2697 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002699 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002701 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2702 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002704 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2705 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
Guido van Rossumd8faa362007-04-27 19:54:29 +00002708 asdl_seq_SET(orelse, 0,
2709 If(expression, suite_seq, suite_seq2,
2710 LINENO(CHILD(n, NCH(n) - 6)),
2711 CHILD(n, NCH(n) - 6)->n_col_offset,
2712 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002713 /* the just-created orelse handled the last elif */
2714 n_elif--;
2715 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Thomas Wouters89f507f2006-12-13 04:49:30 +00002717 for (i = 0; i < n_elif; i++) {
2718 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2720 if (!newobj)
2721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002723 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002726 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
Thomas Wouters89f507f2006-12-13 04:49:30 +00002729 asdl_seq_SET(newobj, 0,
2730 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002731 LINENO(CHILD(n, off)),
2732 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002733 orelse = newobj;
2734 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002735 expression = ast_for_expr(c, CHILD(n, 1));
2736 if (!expression)
2737 return NULL;
2738 suite_seq = ast_for_suite(c, CHILD(n, 3));
2739 if (!suite_seq)
2740 return NULL;
2741 return If(expression, suite_seq, orelse,
2742 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002744
2745 PyErr_Format(PyExc_SystemError,
2746 "unexpected token in 'if' statement: %s", s);
2747 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748}
2749
2750static stmt_ty
2751ast_for_while_stmt(struct compiling *c, const node *n)
2752{
2753 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2754 REQ(n, while_stmt);
2755
2756 if (NCH(n) == 4) {
2757 expr_ty expression;
2758 asdl_seq *suite_seq;
2759
2760 expression = ast_for_expr(c, CHILD(n, 1));
2761 if (!expression)
2762 return NULL;
2763 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002764 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002766 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 }
2768 else if (NCH(n) == 7) {
2769 expr_ty expression;
2770 asdl_seq *seq1, *seq2;
2771
2772 expression = ast_for_expr(c, CHILD(n, 1));
2773 if (!expression)
2774 return NULL;
2775 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002776 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 return NULL;
2778 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002779 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 return NULL;
2781
Thomas Wouters89f507f2006-12-13 04:49:30 +00002782 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002784
2785 PyErr_Format(PyExc_SystemError,
2786 "wrong number of tokens for 'while' statement: %d",
2787 NCH(n));
2788 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002789}
2790
2791static stmt_ty
2792ast_for_for_stmt(struct compiling *c, const node *n)
2793{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002794 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 expr_ty expression;
2796 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002797 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2799 REQ(n, for_stmt);
2800
2801 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002802 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 if (!seq)
2804 return NULL;
2805 }
2806
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002807 node_target = CHILD(n, 1);
2808 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002809 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002811 /* Check the # of children rather than the length of _target, since
2812 for x, in ... has 1 element in _target, but still requires a Tuple. */
2813 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002814 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002815 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002816 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002818 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002819 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 return NULL;
2821 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002822 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002823 return NULL;
2824
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002825 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2826 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827}
2828
2829static excepthandler_ty
2830ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2831{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002832 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 REQ(exc, except_clause);
2834 REQ(body, suite);
2835
2836 if (NCH(exc) == 1) {
2837 asdl_seq *suite_seq = ast_for_suite(c, body);
2838 if (!suite_seq)
2839 return NULL;
2840
Neal Norwitzad74aa82008-03-31 05:14:30 +00002841 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002842 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 }
2844 else if (NCH(exc) == 2) {
2845 expr_ty expression;
2846 asdl_seq *suite_seq;
2847
2848 expression = ast_for_expr(c, CHILD(exc, 1));
2849 if (!expression)
2850 return NULL;
2851 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002852 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002853 return NULL;
2854
Neal Norwitzad74aa82008-03-31 05:14:30 +00002855 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002856 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857 }
2858 else if (NCH(exc) == 4) {
2859 asdl_seq *suite_seq;
2860 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002861 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002862 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002865 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002866 return NULL;
2867 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002868 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 return NULL;
2870
Neal Norwitzad74aa82008-03-31 05:14:30 +00002871 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002872 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002874
2875 PyErr_Format(PyExc_SystemError,
2876 "wrong number of children for 'except' clause: %d",
2877 NCH(exc));
2878 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879}
2880
2881static stmt_ty
2882ast_for_try_stmt(struct compiling *c, const node *n)
2883{
Neal Norwitzf599f422005-12-17 21:33:47 +00002884 const int nch = NCH(n);
2885 int n_except = (nch - 3)/3;
2886 asdl_seq *body, *orelse = NULL, *finally = NULL;
2887
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002888 REQ(n, try_stmt);
2889
Neal Norwitzf599f422005-12-17 21:33:47 +00002890 body = ast_for_suite(c, CHILD(n, 2));
2891 if (body == NULL)
2892 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893
Neal Norwitzf599f422005-12-17 21:33:47 +00002894 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2895 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2896 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2897 /* we can assume it's an "else",
2898 because nch >= 9 for try-else-finally and
2899 it would otherwise have a type of except_clause */
2900 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2901 if (orelse == NULL)
2902 return NULL;
2903 n_except--;
2904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905
Neal Norwitzf599f422005-12-17 21:33:47 +00002906 finally = ast_for_suite(c, CHILD(n, nch - 1));
2907 if (finally == NULL)
2908 return NULL;
2909 n_except--;
2910 }
2911 else {
2912 /* we can assume it's an "else",
2913 otherwise it would have a type of except_clause */
2914 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2915 if (orelse == NULL)
2916 return NULL;
2917 n_except--;
2918 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002921 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 return NULL;
2923 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002924
2925 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002926 int i;
2927 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 /* process except statements to create a try ... except */
2929 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2930 if (handlers == NULL)
2931 return NULL;
2932
2933 for (i = 0; i < n_except; i++) {
2934 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2935 CHILD(n, 5 + i * 3));
2936 if (!e)
2937 return NULL;
2938 asdl_seq_SET(handlers, i, e);
2939 }
2940
Thomas Wouters89f507f2006-12-13 04:49:30 +00002941 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002942 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002943 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002944 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002945
2946 /* if a 'finally' is present too, we nest the TryExcept within a
2947 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002948 body = asdl_seq_new(1, c->c_arena);
2949 if (body == NULL)
2950 return NULL;
2951 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002952 }
2953
2954 /* must be a try ... finally (except clauses are in body, if any exist) */
2955 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002956 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957}
2958
Guido van Rossumc2e20742006-02-27 22:32:47 +00002959static expr_ty
2960ast_for_with_var(struct compiling *c, const node *n)
2961{
2962 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963 return ast_for_expr(c, CHILD(n, 1));
2964}
2965
2966/* with_stmt: 'with' test [ with_var ] ':' suite */
2967static stmt_ty
2968ast_for_with_stmt(struct compiling *c, const node *n)
2969{
2970 expr_ty context_expr, optional_vars = NULL;
2971 int suite_index = 3; /* skip 'with', test, and ':' */
2972 asdl_seq *suite_seq;
2973
2974 assert(TYPE(n) == with_stmt);
2975 context_expr = ast_for_expr(c, CHILD(n, 1));
2976 if (TYPE(CHILD(n, 2)) == with_var) {
2977 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2978
2979 if (!optional_vars) {
2980 return NULL;
2981 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002982 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002983 return NULL;
2984 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002985 suite_index = 4;
2986 }
2987
2988 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2989 if (!suite_seq) {
2990 return NULL;
2991 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002992 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002993 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002994}
2995
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002997ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002999 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003000 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003001 asdl_seq *s;
3002 expr_ty call, dummy;
3003
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 REQ(n, classdef);
3005
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003006 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 s = ast_for_suite(c, CHILD(n, 3));
3008 if (!s)
3009 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003010 classname = NEW_IDENTIFIER(CHILD(n, 1));
3011 if (!classname)
3012 return NULL;
3013 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3014 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003016
3017 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 s = ast_for_suite(c, CHILD(n,5));
3019 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003020 return NULL;
3021 classname = NEW_IDENTIFIER(CHILD(n, 1));
3022 if (!classname)
3023 return NULL;
3024 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3025 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 }
3027
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003028 /* class NAME '(' arglist ')' ':' suite */
3029 /* build up a fake Call node so we can extract its pieces */
3030 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3031 call = ast_for_call(c, CHILD(n, 3), dummy);
3032 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003035 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003036 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003037 classname = NEW_IDENTIFIER(CHILD(n, 1));
3038 if (!classname)
3039 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003040
Benjamin Peterson30760062008-11-25 04:02:28 +00003041 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003042 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003043 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044}
3045
3046static stmt_ty
3047ast_for_stmt(struct compiling *c, const node *n)
3048{
3049 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003050 assert(NCH(n) == 1);
3051 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 }
3053 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003054 assert(num_stmts(n) == 1);
3055 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 }
3057 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003058 REQ(n, small_stmt);
3059 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003060 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3061 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003062 */
3063 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 case expr_stmt:
3065 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 case del_stmt:
3067 return ast_for_del_stmt(c, n);
3068 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003069 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 case flow_stmt:
3071 return ast_for_flow_stmt(c, n);
3072 case import_stmt:
3073 return ast_for_import_stmt(c, n);
3074 case global_stmt:
3075 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003076 case nonlocal_stmt:
3077 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 case assert_stmt:
3079 return ast_for_assert_stmt(c, n);
3080 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003081 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3083 TYPE(n), NCH(n));
3084 return NULL;
3085 }
3086 }
3087 else {
3088 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003089 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003090 */
3091 node *ch = CHILD(n, 0);
3092 REQ(n, compound_stmt);
3093 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094 case if_stmt:
3095 return ast_for_if_stmt(c, ch);
3096 case while_stmt:
3097 return ast_for_while_stmt(c, ch);
3098 case for_stmt:
3099 return ast_for_for_stmt(c, ch);
3100 case try_stmt:
3101 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003102 case with_stmt:
3103 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003105 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003107 return ast_for_classdef(c, ch, NULL);
3108 case decorated:
3109 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003111 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003112 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3113 TYPE(n), NCH(n));
3114 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003115 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003116 }
3117}
3118
3119static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003120parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003121{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003122 const char *end;
3123 long x;
3124 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003125#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003126 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003127 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128#endif
3129
Guido van Rossumd8faa362007-04-27 19:54:29 +00003130 errno = 0;
3131 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003133 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003135 if (s[0] == '0') {
3136 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3137 if (x < 0 && errno == 0) {
3138 return PyLong_FromString((char *)s,
3139 (char **)0,
3140 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003141 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003142 }
3143 else
3144 x = PyOS_strtol((char *)s, (char **)&end, 0);
3145 if (*end == '\0') {
3146 if (errno != 0)
3147 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003148 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003149 }
3150 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003152 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003153 compl.real = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003154 PyFPE_START_PROTECT("atof", return 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003155 compl.imag = PyOS_ascii_atof(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 PyFPE_END_PROTECT(c)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003157 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003158 }
3159 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 {
3162 PyFPE_START_PROTECT("atof", return 0)
3163 dx = PyOS_ascii_atof(s);
3164 PyFPE_END_PROTECT(dx)
3165 return PyFloat_FromDouble(dx);
3166 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167}
3168
3169static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003170decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 PyObject *u, *v;
3173 char *s, *t;
3174 t = s = (char *)*sPtr;
3175 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3176 while (s < end && (*s & 0x80)) s++;
3177 *sPtr = s;
3178 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3179 if (u == NULL)
3180 return NULL;
3181 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3182 Py_DECREF(u);
3183 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003184}
3185
3186static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003187decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003188{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003189 PyObject *v, *u;
3190 char *buf;
3191 char *p;
3192 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003193
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 if (encoding == NULL) {
3195 buf = (char *)s;
3196 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003197 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003198 /* check for integer overflow */
3199 if (len > PY_SIZE_MAX / 4)
3200 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003201 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003202 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003203 if (u == NULL)
3204 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003205 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003206 end = s + len;
3207 while (s < end) {
3208 if (*s == '\\') {
3209 *p++ = *s++;
3210 if (*s & 0x80) {
3211 strcpy(p, "u005c");
3212 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003213 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 }
3215 if (*s & 0x80) { /* XXX inefficient */
3216 PyObject *w;
3217 char *r;
3218 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003219 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 if (w == NULL) {
3221 Py_DECREF(u);
3222 return NULL;
3223 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003224 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003225 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003226 assert(rn % 2 == 0);
3227 for (i = 0; i < rn; i += 2) {
3228 sprintf(p, "\\u%02x%02x",
3229 r[i + 0] & 0xFF,
3230 r[i + 1] & 0xFF);
3231 p += 6;
3232 }
3233 Py_DECREF(w);
3234 } else {
3235 *p++ = *s++;
3236 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 len = p - buf;
3239 s = buf;
3240 }
3241 if (rawmode)
3242 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3243 else
3244 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3245 Py_XDECREF(u);
3246 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247}
3248
3249/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003250 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003251 * parsestr parses it, and returns the decoded Python string object.
3252 */
3253static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003254parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003256 size_t len;
3257 const char *s = STR(n);
3258 int quote = Py_CHARMASK(*s);
3259 int rawmode = 0;
3260 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003261 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003262 if (quote == 'b' || quote == 'B') {
3263 quote = *++s;
3264 *bytesmode = 1;
3265 }
3266 if (quote == 'r' || quote == 'R') {
3267 quote = *++s;
3268 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003269 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003270 }
3271 if (quote != '\'' && quote != '\"') {
3272 PyErr_BadInternalCall();
3273 return NULL;
3274 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 s++;
3276 len = strlen(s);
3277 if (len > INT_MAX) {
3278 PyErr_SetString(PyExc_OverflowError,
3279 "string to parse is too long");
3280 return NULL;
3281 }
3282 if (s[--len] != quote) {
3283 PyErr_BadInternalCall();
3284 return NULL;
3285 }
3286 if (len >= 4 && s[0] == quote && s[1] == quote) {
3287 s += 2;
3288 len -= 2;
3289 if (s[--len] != quote || s[--len] != quote) {
3290 PyErr_BadInternalCall();
3291 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003292 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003294 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003295 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 if (*bytesmode) {
3298 /* Disallow non-ascii characters (but not escapes) */
3299 const char *c;
3300 for (c = s; *c; c++) {
3301 if (Py_CHARMASK(*c) >= 0x80) {
3302 ast_error(n, "bytes can only contain ASCII "
3303 "literal characters.");
3304 return NULL;
3305 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003306 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003307 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003308 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003309 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 if (rawmode || strchr(s, '\\') == NULL) {
3311 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003312 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003313 if (u == NULL || !*bytesmode)
3314 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003315 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003316 Py_DECREF(u);
3317 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003318 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003319 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003320 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003321 return PyUnicode_FromStringAndSize(s, len);
3322 } else {
3323 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003324 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003325 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003326 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003327 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328}
3329
Guido van Rossum29fd7122007-11-12 01:13:56 +00003330/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003331 * compile-time literal catenation, calling parsestr() on each piece, and
3332 * pasting the intermediate results together.
3333 */
3334static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003335parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 PyObject *v;
3338 int i;
3339 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003340 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003341 if (v != NULL) {
3342 /* String literal concatenation */
3343 for (i = 1; i < NCH(n); i++) {
3344 PyObject *s;
3345 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003346 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003347 if (s == NULL)
3348 goto onError;
3349 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003350 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003351 goto onError;
3352 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003353 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3354 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003355 if (v == NULL)
3356 goto onError;
3357 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003358 else {
3359 PyObject *temp = PyUnicode_Concat(v, s);
3360 Py_DECREF(s);
3361 Py_DECREF(v);
3362 v = temp;
3363 if (v == NULL)
3364 goto onError;
3365 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003366 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003367 }
3368 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369
Guido van Rossumd8faa362007-04-27 19:54:29 +00003370 onError:
3371 Py_XDECREF(v);
3372 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373}