blob: 7c059debb3d7c0812e5e84d3652ea1ca65ac28bb [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file includes functions to transform a concrete syntax tree (CST) to
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode().
4 *
5 */
6#include "Python.h"
7#include "Python-ast.h"
8#include "grammar.h"
9#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000010#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000011#include "ast.h"
12#include "token.h"
13#include "parsetok.h"
14#include "graminit.h"
15
16#include <assert.h>
17
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000018/* Data structure used internally */
19struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000020 char *c_encoding; /* source encoding */
21 PyArena *c_arena; /* arena for allocating memeory */
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +000022 const char *c_filename; /* filename */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000023};
24
25static asdl_seq *seq_for_testlist(struct compiling *, const node *);
26static expr_ty ast_for_expr(struct compiling *, const node *);
27static stmt_ty ast_for_stmt(struct compiling *, const node *);
28static asdl_seq *ast_for_suite(struct compiling *, const node *);
Guido van Rossumd8faa362007-04-27 19:54:29 +000029static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
30 expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000031static expr_ty ast_for_testlist(struct compiling *, const node *);
Guido van Rossumd59da4b2007-05-22 18:11:13 +000032static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033
34/* Note different signature for ast_for_call */
35static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
36
Christian Heimes81ee3ef2008-05-04 22:42:01 +000037static PyObject *parsenumber(struct compiling *, const char *);
Christian Heimes4d6ec852008-03-26 22:34:47 +000038static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
Thomas Wouters00e41de2007-02-23 19:56:57 +000039static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Thomas Heller50d5a1c2008-11-25 12:35:58 +000054 Py_UNICODE *u;
Benjamin Peterson30760062008-11-25 04:02:28 +000055 if (!id)
56 return NULL;
Thomas Heller50d5a1c2008-11-25 12:35:58 +000057 u = PyUnicode_AS_UNICODE(id);
Martin v. Löwis47383402007-08-15 07:32:56 +000058 /* Check whether there are non-ASCII characters in the
59 identifier; if so, normalize to NFKC. */
60 for (; *u; u++) {
61 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000062 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000063 PyObject *id2;
64 if (!m)
65 return NULL;
66 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
67 Py_DECREF(m);
68 if (!id2)
69 return NULL;
70 Py_DECREF(id);
71 id = id2;
72 break;
73 }
74 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000075 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000076 PyArena_AddPyObject(arena, id);
77 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078}
79
Neal Norwitzadb69fc2005-12-17 20:54:49 +000080#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081
82/* This routine provides an invalid object for the syntax error.
83 The outermost routine must unpack this error and create the
84 proper object. We do this so that we don't have to pass
85 the filename to everything function.
86
87 XXX Maybe we should just pass the filename...
88*/
89
90static int
91ast_error(const node *n, const char *errstr)
92{
93 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
94 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000096 PyErr_SetObject(PyExc_SyntaxError, u);
97 Py_DECREF(u);
98 return 0;
99}
100
101static void
102ast_error_finish(const char *filename)
103{
104 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000105 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
107 assert(PyErr_Occurred());
108 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000109 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
111 PyErr_Fetch(&type, &value, &tback);
112 errstr = PyTuple_GetItem(value, 0);
113 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000114 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000116 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118 Py_DECREF(errstr);
119 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000120 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 Py_DECREF(value);
122
123 loc = PyErr_ProgramText(filename, lineno);
124 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000125 Py_INCREF(Py_None);
126 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000128 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000131 Py_DECREF(errstr);
132 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000133 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135 Py_DECREF(errstr);
136 Py_DECREF(tmp);
137 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000138 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyErr_Restore(type, value, tback);
140}
141
142/* num_stmts() returns number of contained statements.
143
144 Use this routine to determine how big a sequence is needed for
145 the statements in a parse tree. Its raison d'etre is this bit of
146 grammar:
147
148 stmt: simple_stmt | compound_stmt
149 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
150
151 A simple_stmt can contain multiple small_stmt elements joined
152 by semicolons. If the arg is a simple_stmt, the number of
153 small_stmt elements is returned.
154*/
155
156static int
157num_stmts(const node *n)
158{
159 int i, l;
160 node *ch;
161
162 switch (TYPE(n)) {
163 case single_input:
164 if (TYPE(CHILD(n, 0)) == NEWLINE)
165 return 0;
166 else
167 return num_stmts(CHILD(n, 0));
168 case file_input:
169 l = 0;
170 for (i = 0; i < NCH(n); i++) {
171 ch = CHILD(n, i);
172 if (TYPE(ch) == stmt)
173 l += num_stmts(ch);
174 }
175 return l;
176 case stmt:
177 return num_stmts(CHILD(n, 0));
178 case compound_stmt:
179 return 1;
180 case simple_stmt:
181 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
182 case suite:
183 if (NCH(n) == 1)
184 return num_stmts(CHILD(n, 0));
185 else {
186 l = 0;
187 for (i = 2; i < (NCH(n) - 1); i++)
188 l += num_stmts(CHILD(n, i));
189 return l;
190 }
191 default: {
192 char buf[128];
193
194 sprintf(buf, "Non-statement found: %d %d\n",
195 TYPE(n), NCH(n));
196 Py_FatalError(buf);
197 }
198 }
199 assert(0);
200 return 0;
201}
202
203/* Transform the CST rooted at node * to the appropriate AST
204*/
205
206mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000207PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
208 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000210 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 asdl_seq *stmts = NULL;
212 stmt_ty s;
213 node *ch;
214 struct compiling c;
215
216 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000217 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000218 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000219#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000220 ast_error(n, "encoding declaration in Unicode string");
221 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000222#endif
223 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 } else if (TYPE(n) == encoding_decl) {
226 c.c_encoding = STR(n);
227 n = CHILD(n, 0);
228 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000229 /* PEP 3120 */
230 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000232 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000233 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234
Jeremy Hyltona8293132006-02-28 17:58:27 +0000235 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 switch (TYPE(n)) {
237 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000238 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 for (i = 0; i < NCH(n) - 1; i++) {
242 ch = CHILD(n, i);
243 if (TYPE(ch) == NEWLINE)
244 continue;
245 REQ(ch, stmt);
246 num = num_stmts(ch);
247 if (num == 1) {
248 s = ast_for_stmt(&c, ch);
249 if (!s)
250 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000251 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000252 }
253 else {
254 ch = CHILD(ch, 0);
255 REQ(ch, simple_stmt);
256 for (j = 0; j < num; j++) {
257 s = ast_for_stmt(&c, CHILD(ch, j * 2));
258 if (!s)
259 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000260 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 }
262 }
263 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000264 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 case eval_input: {
266 expr_ty testlist_ast;
267
Nick Coghlan650f0d02007-04-15 12:05:43 +0000268 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000269 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!testlist_ast)
271 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000272 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273 }
274 case single_input:
275 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000276 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000279 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
280 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000281 if (!asdl_seq_GET(stmts, 0))
282 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000283 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284 }
285 else {
286 n = CHILD(n, 0);
287 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000288 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000292 s = ast_for_stmt(&c, n);
293 if (!s)
294 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295 asdl_seq_SET(stmts, 0, s);
296 }
297 else {
298 /* Only a simple_stmt can contain multiple statements. */
299 REQ(n, simple_stmt);
300 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000301 if (TYPE(CHILD(n, i)) == NEWLINE)
302 break;
303 s = ast_for_stmt(&c, CHILD(n, i));
304 if (!s)
305 goto error;
306 asdl_seq_SET(stmts, i / 2, s);
307 }
308 }
309
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000310 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311 }
312 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000313 PyErr_Format(PyExc_SystemError,
314 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 goto error;
316 }
317 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318 ast_error_finish(filename);
319 return NULL;
320}
321
322/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
323*/
324
325static operator_ty
326get_operator(const node *n)
327{
328 switch (TYPE(n)) {
329 case VBAR:
330 return BitOr;
331 case CIRCUMFLEX:
332 return BitXor;
333 case AMPER:
334 return BitAnd;
335 case LEFTSHIFT:
336 return LShift;
337 case RIGHTSHIFT:
338 return RShift;
339 case PLUS:
340 return Add;
341 case MINUS:
342 return Sub;
343 case STAR:
344 return Mult;
345 case SLASH:
346 return Div;
347 case DOUBLESLASH:
348 return FloorDiv;
349 case PERCENT:
350 return Mod;
351 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000353 }
354}
355
Guido van Rossume7ba4952007-06-06 23:52:48 +0000356static const char* FORBIDDEN[] = {
357 "None",
358 "True",
359 "False",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000360 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000361 NULL,
362};
363
364static int
365forbidden_name(expr_ty e, const node *n)
366{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000368 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000369 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000370 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000371 ast_error(n, "assignment to keyword");
372 return 1;
373 }
374 }
375 return 0;
376}
377
Jeremy Hyltona8293132006-02-28 17:58:27 +0000378/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379
380 Only sets context for expr kinds that "can appear in assignment context"
381 (according to ../Parser/Python.asdl). For other expr kinds, it sets
382 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383*/
384
385static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000386set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387{
388 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000389 /* If a particular expression type can't be used for assign / delete,
390 set expr_name to its name and an error message will be generated.
391 */
392 const char* expr_name = NULL;
393
394 /* The ast defines augmented store and load contexts, but the
395 implementation here doesn't actually use them. The code may be
396 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000398 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000399 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000400 */
401 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000402
403 switch (e->kind) {
404 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Attribute.ctx = ctx;
406 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000408 e->v.Subscript.ctx = ctx;
409 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 case Starred_kind:
411 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000412 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000413 return 0;
414 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000416 if (ctx == Store) {
417 if (forbidden_name(e, n))
418 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 }
420 e->v.Name.ctx = ctx;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 e->v.List.ctx = ctx;
424 s = e->v.List.elts;
425 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 case Tuple_kind:
427 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
428 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 e->v.Tuple.ctx = ctx;
430 s = e->v.Tuple.elts;
431 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 case Lambda_kind:
433 expr_name = "lambda";
434 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000437 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000438 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 case UnaryOp_kind:
441 expr_name = "operator";
442 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000444 expr_name = "generator expression";
445 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000446 case Yield_kind:
447 expr_name = "yield expression";
448 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000449 case ListComp_kind:
450 expr_name = "list comprehension";
451 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000452 case SetComp_kind:
453 expr_name = "set comprehension";
454 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000455 case DictComp_kind:
456 expr_name = "dict comprehension";
457 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000459 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460 case Num_kind:
461 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000462 expr_name = "literal";
463 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000464 case Ellipsis_kind:
465 expr_name = "Ellipsis";
466 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000467 case Compare_kind:
468 expr_name = "comparison";
469 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 case IfExp_kind:
471 expr_name = "conditional expression";
472 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000473 default:
474 PyErr_Format(PyExc_SystemError,
475 "unexpected expression in assignment %d (line %d)",
476 e->kind, e->lineno);
477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000479 /* Check for error string set by switch */
480 if (expr_name) {
481 char buf[300];
482 PyOS_snprintf(buf, sizeof(buf),
483 "can't %s %s",
484 ctx == Store ? "assign to" : "delete",
485 expr_name);
486 return ast_error(n, buf);
487 }
488
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000490 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000491 */
492 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494
Thomas Wouters89f507f2006-12-13 04:49:30 +0000495 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000496 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000497 return 0;
498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499 }
500 return 1;
501}
502
503static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000504ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505{
506 REQ(n, augassign);
507 n = CHILD(n, 0);
508 switch (STR(n)[0]) {
509 case '+':
510 return Add;
511 case '-':
512 return Sub;
513 case '/':
514 if (STR(n)[1] == '/')
515 return FloorDiv;
516 else
517 return Div;
518 case '%':
519 return Mod;
520 case '<':
521 return LShift;
522 case '>':
523 return RShift;
524 case '&':
525 return BitAnd;
526 case '^':
527 return BitXor;
528 case '|':
529 return BitOr;
530 case '*':
531 if (STR(n)[1] == '*')
532 return Pow;
533 else
534 return Mult;
535 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000536 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538 }
539}
540
541static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000542ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000543{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000544 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545 |'is' 'not'
546 */
547 REQ(n, comp_op);
548 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000549 n = CHILD(n, 0);
550 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000551 case LESS:
552 return Lt;
553 case GREATER:
554 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000555 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000556 return Eq;
557 case LESSEQUAL:
558 return LtE;
559 case GREATEREQUAL:
560 return GtE;
561 case NOTEQUAL:
562 return NotEq;
563 case NAME:
564 if (strcmp(STR(n), "in") == 0)
565 return In;
566 if (strcmp(STR(n), "is") == 0)
567 return Is;
568 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000569 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000571 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 }
574 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000575 /* handle "not in" and "is not" */
576 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577 case NAME:
578 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
579 return NotIn;
580 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
581 return IsNot;
582 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000583 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000585 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587 }
Neal Norwitz79792652005-11-14 04:25:03 +0000588 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000591}
592
593static asdl_seq *
594seq_for_testlist(struct compiling *c, const node *n)
595{
596 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000597 asdl_seq *seq;
598 expr_ty expression;
599 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000600 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000602 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603 if (!seq)
604 return NULL;
605
606 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000607 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
613 assert(i / 2 < seq->size);
614 asdl_seq_SET(seq, i / 2, expression);
615 }
616 return seq;
617}
618
Neal Norwitzc1505362006-12-28 06:47:50 +0000619static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000620compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000621{
622 identifier name;
623 expr_ty annotation = NULL;
624 node *ch;
625
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000626 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000627 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000628 name = NEW_IDENTIFIER(ch);
629 if (!name)
630 return NULL;
631
632 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
633 annotation = ast_for_expr(c, CHILD(n, 2));
634 if (!annotation)
635 return NULL;
636 }
637
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000638 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000639#if 0
640 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
641 if (!set_context(c, result, Store, n))
642 return NULL;
643 return result;
644#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645}
646
Guido van Rossum4f72a782006-10-27 23:31:49 +0000647/* returns -1 if failed to handle keyword only arguments
648 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000649 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 ^^^
651 start pointing here
652 */
653static int
654handle_keywordonly_args(struct compiling *c, const node *n, int start,
655 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
656{
657 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000658 expr_ty expression, annotation;
659 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000660 int i = start;
661 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000662
663 if (kwonlyargs == NULL) {
664 ast_error(CHILD(n, start), "named arguments must follow bare *");
665 return -1;
666 }
667 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000668 while (i < NCH(n)) {
669 ch = CHILD(n, i);
670 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000671 case vfpdef:
672 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000673 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000674 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000675 asdl_seq_SET(kwdefaults, j, expression);
676 i += 2; /* '=' and test */
677 }
678 else { /* setting NULL if no default value exists */
679 asdl_seq_SET(kwdefaults, j, NULL);
680 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000681 if (NCH(ch) == 3) {
682 /* ch is NAME ':' test */
683 annotation = ast_for_expr(c, CHILD(ch, 2));
684 if (!annotation) {
685 ast_error(ch, "expected expression");
686 goto error;
687 }
688 }
689 else {
690 annotation = NULL;
691 }
692 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000693 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000695 ast_error(ch, "expecting name");
696 goto error;
697 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000698 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000699 i += 2; /* the name and the comma */
700 break;
701 case DOUBLESTAR:
702 return i;
703 default:
704 ast_error(ch, "unexpected node");
705 goto error;
706 }
707 }
708 return i;
709 error:
710 return -1;
711}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000712
Jeremy Hyltona8293132006-02-28 17:58:27 +0000713/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000714
715static arguments_ty
716ast_for_arguments(struct compiling *c, const node *n)
717{
Neal Norwitzc1505362006-12-28 06:47:50 +0000718 /* This function handles both typedargslist (function definition)
719 and varargslist (lambda definition).
720
721 parameters: '(' [typedargslist] ')'
722 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000723 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
724 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000725 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000726 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
729 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000730 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000731 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000733 int i, j, k, nposargs = 0, nkwonlyargs = 0;
734 int nposdefaults = 0, found_default = 0;
735 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 arg_ty arg;
738 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 node *ch;
740
741 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000742 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000743 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
744 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000747 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748
Jeremy Hyltone921e022008-07-17 16:37:17 +0000749 /* First count the number of positional args & defaults. The
750 variable i is the loop index for this for loop and the next.
751 The next loop picks up where the first leaves off.
752 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000754 ch = CHILD(n, i);
755 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000756 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000757 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000758 if (i < NCH(n) && /* skip argument following star */
759 (TYPE(CHILD(n, i)) == tfpdef ||
760 TYPE(CHILD(n, i)) == vfpdef)) {
761 i++;
762 }
763 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000764 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000765 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 /* count the number of keyword only args &
770 defaults for keyword only args */
771 for ( ; i < NCH(n); ++i) {
772 ch = CHILD(n, i);
773 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000774 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
777 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000778 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000779 kwonlyargs = (nkwonlyargs ?
780 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
781 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000782 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000783 posdefaults = (nposdefaults ?
784 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
785 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000786 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000787 /* The length of kwonlyargs and kwdefaults are same
788 since we set NULL as default for keyword only argument w/o default
789 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000790 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
792 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000793 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000794
795 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000796 ast_error(n, "more than 255 arguments");
797 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000798 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000800 /* tfpdef: NAME [':' test]
801 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802 */
803 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000804 j = 0; /* index for defaults */
805 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 ch = CHILD(n, i);
808 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000809 case tfpdef:
810 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000811 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
812 anything other than EQUAL or a comma? */
813 /* XXX Should NCH(n) check be made a separate check? */
814 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000815 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
816 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000817 goto error;
818 assert(posdefaults != NULL);
819 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000821 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000822 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000823 else if (found_default) {
824 ast_error(n,
825 "non-default argument follows default argument");
826 goto error;
827 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000828 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000829 if (!arg)
830 goto error;
831 asdl_seq_SET(posargs, k++, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832 i += 2; /* the name and the comma */
833 break;
834 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000835 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000836 ast_error(CHILD(n, i),
837 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000838 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000839 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000840 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 if (TYPE(ch) == COMMA) {
842 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000843 i += 2; /* now follows keyword only arguments */
844 res = handle_keywordonly_args(c, n, i,
845 kwonlyargs, kwdefaults);
846 if (res == -1) goto error;
847 i = res; /* res has new position to process */
848 }
849 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000850 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
Benjamin Peterson30760062008-11-25 04:02:28 +0000851 if (!vararg)
852 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000853 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000854 /* there is an annotation on the vararg */
855 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000856 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000857 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000858 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
859 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000860 int res = 0;
861 res = handle_keywordonly_args(c, n, i,
862 kwonlyargs, kwdefaults);
863 if (res == -1) goto error;
864 i = res; /* res has new position to process */
865 }
866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 break;
868 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000869 ch = CHILD(n, i+1); /* tfpdef */
870 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000871 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
872 if (NCH(ch) > 1) {
873 /* there is an annotation on the kwarg */
874 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
875 }
Benjamin Peterson30760062008-11-25 04:02:28 +0000876 if (!kwarg)
877 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878 i += 3;
879 break;
880 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000881 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 "unexpected node in varargslist: %d @ %d",
883 TYPE(ch), i);
884 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000885 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000887 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
888 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000890 Py_XDECREF(vararg);
891 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892 return NULL;
893}
894
895static expr_ty
896ast_for_dotted_name(struct compiling *c, const node *n)
897{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000898 expr_ty e;
899 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000900 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901 int i;
902
903 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000904
905 lineno = LINENO(n);
906 col_offset = n->n_col_offset;
907
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908 id = NEW_IDENTIFIER(CHILD(n, 0));
909 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000910 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000911 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000913 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914
915 for (i = 2; i < NCH(n); i+=2) {
916 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000917 if (!id)
918 return NULL;
919 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
920 if (!e)
921 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 }
923
924 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925}
926
927static expr_ty
928ast_for_decorator(struct compiling *c, const node *n)
929{
930 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
931 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000932 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933
934 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000935 REQ(CHILD(n, 0), AT);
936 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937
938 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
939 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000940 return NULL;
941
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000943 d = name_expr;
944 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 }
946 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000947 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000948 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000949 if (!d)
950 return NULL;
951 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 }
953 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000954 d = ast_for_call(c, CHILD(n, 3), name_expr);
955 if (!d)
956 return NULL;
957 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000958 }
959
960 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961}
962
963static asdl_seq*
964ast_for_decorators(struct compiling *c, const node *n)
965{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000966 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000967 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 int i;
969
970 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000971 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 if (!decorator_seq)
973 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000975 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000976 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000977 if (!d)
978 return NULL;
979 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 }
981 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000982}
983
984static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000985ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000987 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000988 identifier name;
989 arguments_ty args;
990 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000991 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000992 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993
994 REQ(n, funcdef);
995
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 name = NEW_IDENTIFIER(CHILD(n, name_i));
997 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 args = ast_for_arguments(c, CHILD(n, name_i + 1));
1000 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001001 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00001002 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
1003 returns = ast_for_expr(c, CHILD(n, name_i + 3));
1004 if (!returns)
1005 return NULL;
1006 name_i += 2;
1007 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 body = ast_for_suite(c, CHILD(n, name_i + 3));
1009 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011
Neal Norwitzc1505362006-12-28 06:47:50 +00001012 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001013 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014}
1015
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001016static stmt_ty
1017ast_for_decorated(struct compiling *c, const node *n)
1018{
1019 /* decorated: decorators (classdef | funcdef) */
1020 stmt_ty thing = NULL;
1021 asdl_seq *decorator_seq = NULL;
1022
1023 REQ(n, decorated);
1024
1025 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1026 if (!decorator_seq)
1027 return NULL;
1028
1029 assert(TYPE(CHILD(n, 1)) == funcdef ||
1030 TYPE(CHILD(n, 1)) == classdef);
1031
1032 if (TYPE(CHILD(n, 1)) == funcdef) {
1033 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1034 } else if (TYPE(CHILD(n, 1)) == classdef) {
1035 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1036 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001037 /* we count the decorators in when talking about the class' or
1038 * function's line number */
1039 if (thing) {
1040 thing->lineno = LINENO(n);
1041 thing->col_offset = n->n_col_offset;
1042 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001043 return thing;
1044}
1045
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046static expr_ty
1047ast_for_lambdef(struct compiling *c, const node *n)
1048{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001049 /* lambdef: 'lambda' [varargslist] ':' test
1050 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 arguments_ty args;
1052 expr_ty expression;
1053
1054 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001055 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1056 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 if (!args)
1058 return NULL;
1059 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001060 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001061 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001062 }
1063 else {
1064 args = ast_for_arguments(c, CHILD(n, 1));
1065 if (!args)
1066 return NULL;
1067 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001068 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070 }
1071
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001072 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073}
1074
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001075static expr_ty
1076ast_for_ifexpr(struct compiling *c, const node *n)
1077{
1078 /* test: or_test 'if' or_test 'else' test */
1079 expr_ty expression, body, orelse;
1080
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001081 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001082 body = ast_for_expr(c, CHILD(n, 0));
1083 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001085 expression = ast_for_expr(c, CHILD(n, 2));
1086 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001088 orelse = ast_for_expr(c, CHILD(n, 4));
1089 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001090 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001091 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1092 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001093}
1094
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001096 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097
Nick Coghlan650f0d02007-04-15 12:05:43 +00001098 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099*/
1100
1101static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001102count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001103{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 count_comp_for:
1107 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001108 REQ(n, comp_for);
1109 if (NCH(n) == 5)
1110 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 else
1112 return n_fors;
1113 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001114 REQ(n, comp_iter);
1115 n = CHILD(n, 0);
1116 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001118 else if (TYPE(n) == comp_if) {
1119 if (NCH(n) == 3) {
1120 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001122 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001123 else
1124 return n_fors;
1125 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001126
Guido van Rossumd8faa362007-04-27 19:54:29 +00001127 /* Should never be reached */
1128 PyErr_SetString(PyExc_SystemError,
1129 "logic error in count_comp_fors");
1130 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131}
1132
Nick Coghlan650f0d02007-04-15 12:05:43 +00001133/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134
Nick Coghlan650f0d02007-04-15 12:05:43 +00001135 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136*/
1137
1138static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001139count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001141 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001142
Guido van Rossumd8faa362007-04-27 19:54:29 +00001143 while (1) {
1144 REQ(n, comp_iter);
1145 if (TYPE(CHILD(n, 0)) == comp_for)
1146 return n_ifs;
1147 n = CHILD(n, 0);
1148 REQ(n, comp_if);
1149 n_ifs++;
1150 if (NCH(n) == 2)
1151 return n_ifs;
1152 n = CHILD(n, 2);
1153 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154}
1155
Guido van Rossum992d4a32007-07-11 13:09:30 +00001156static asdl_seq *
1157ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001160 asdl_seq *comps;
1161
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001162 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 if (n_fors == -1)
1164 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001165
Nick Coghlan650f0d02007-04-15 12:05:43 +00001166 comps = asdl_seq_new(n_fors, c->c_arena);
1167 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001169
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001170 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001171 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 asdl_seq *t;
1173 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001174 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175
Guido van Rossum992d4a32007-07-11 13:09:30 +00001176 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177
Guido van Rossum992d4a32007-07-11 13:09:30 +00001178 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001179 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001182 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001183 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185
Thomas Wouters89f507f2006-12-13 04:49:30 +00001186 /* Check the # of children rather than the length of t, since
1187 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1188 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001189 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1190 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001192 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001193 c->c_arena),
1194 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001195
Nick Coghlan650f0d02007-04-15 12:05:43 +00001196 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001198
Guido van Rossum992d4a32007-07-11 13:09:30 +00001199 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 int j, n_ifs;
1201 asdl_seq *ifs;
1202
Guido van Rossum992d4a32007-07-11 13:09:30 +00001203 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001204 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207
1208 ifs = asdl_seq_new(n_ifs, c->c_arena);
1209 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001211
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001213 REQ(n, comp_iter);
1214 n = CHILD(n, 0);
1215 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216
Guido van Rossum992d4a32007-07-11 13:09:30 +00001217 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001218 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001219 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001220 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001221 if (NCH(n) == 3)
1222 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001223 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001224 /* on exit, must guarantee that n is a comp_for */
1225 if (TYPE(n) == comp_iter)
1226 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001227 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001229 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001231 return comps;
1232}
1233
1234static expr_ty
1235ast_for_itercomp(struct compiling *c, const node *n, int type)
1236{
1237 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1238 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1239 expr_ty elt;
1240 asdl_seq *comps;
1241
1242 assert(NCH(n) > 1);
1243
1244 elt = ast_for_expr(c, CHILD(n, 0));
1245 if (!elt)
1246 return NULL;
1247
1248 comps = ast_for_comprehension(c, CHILD(n, 1));
1249 if (!comps)
1250 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251
1252 if (type == COMP_GENEXP)
1253 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1254 else if (type == COMP_LISTCOMP)
1255 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1256 else if (type == COMP_SETCOMP)
1257 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1258 else
1259 /* Should never happen */
1260 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261}
1262
1263static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001264ast_for_dictcomp(struct compiling *c, const node *n)
1265{
1266 expr_ty key, value;
1267 asdl_seq *comps;
1268
1269 assert(NCH(n) > 3);
1270 REQ(CHILD(n, 1), COLON);
1271
1272 key = ast_for_expr(c, CHILD(n, 0));
1273 if (!key)
1274 return NULL;
1275
1276 value = ast_for_expr(c, CHILD(n, 2));
1277 if (!value)
1278 return NULL;
1279
1280 comps = ast_for_comprehension(c, CHILD(n, 3));
1281 if (!comps)
1282 return NULL;
1283
1284 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1285}
1286
1287static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001288ast_for_genexp(struct compiling *c, const node *n)
1289{
1290 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001291 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001292}
1293
1294static expr_ty
1295ast_for_listcomp(struct compiling *c, const node *n)
1296{
1297 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001298 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001299}
1300
1301static expr_ty
1302ast_for_setcomp(struct compiling *c, const node *n)
1303{
1304 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001305 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001306}
1307
1308
1309static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001310ast_for_atom(struct compiling *c, const node *n)
1311{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001312 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1313 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001314 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315 */
1316 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001317 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318
1319 switch (TYPE(ch)) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001320 case NAME: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001321 /* All names start in Load context, but may later be
1322 changed. */
Benjamin Peterson30760062008-11-25 04:02:28 +00001323 PyObject *name = NEW_IDENTIFIER(ch);
1324 if (!name)
1325 return NULL;
1326 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001329 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001330 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001331 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 PyObject *type, *value, *tback, *errstr;
1333 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001334 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001335 if (errstr) {
1336 char *s = "";
1337 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001338 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001339 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1340 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001341 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001342 } else {
1343 ast_error(n, "(unicode error) unknown error");
1344 }
1345 Py_DECREF(type);
1346 Py_DECREF(value);
1347 Py_XDECREF(tback);
1348 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001349 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001350 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001352 if (bytesmode)
1353 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1354 else
1355 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 }
1357 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001358 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001359 if (!pynum)
1360 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001361
Thomas Wouters89f507f2006-12-13 04:49:30 +00001362 PyArena_AddPyObject(c->c_arena, pynum);
1363 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 }
Georg Brandldde00282007-03-18 19:01:53 +00001365 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001366 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001368 ch = CHILD(n, 1);
1369
1370 if (TYPE(ch) == RPAR)
1371 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1372
1373 if (TYPE(ch) == yield_expr)
1374 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001375
1376 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1377 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001378 return ast_for_genexp(c, ch);
1379
Nick Coghlan650f0d02007-04-15 12:05:43 +00001380 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 ch = CHILD(n, 1);
1383
1384 if (TYPE(ch) == RSQB)
1385 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1386
Nick Coghlan650f0d02007-04-15 12:05:43 +00001387 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001388 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1389 asdl_seq *elts = seq_for_testlist(c, ch);
1390 if (!elts)
1391 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001392
Thomas Wouters89f507f2006-12-13 04:49:30 +00001393 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1394 }
1395 else
1396 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001398 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1399 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001400 int i, size;
1401 asdl_seq *keys, *values;
1402
1403 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001404 if (TYPE(ch) == RBRACE) {
1405 /* it's an empty dict */
1406 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1407 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1408 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001409 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001410 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001411 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001412 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001413 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001414 for (i = 0; i < NCH(ch); i += 2) {
1415 expr_ty expression;
1416 expression = ast_for_expr(c, CHILD(ch, i));
1417 if (!expression)
1418 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001419 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001420 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001421 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1422 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1423 /* it's a set comprehension */
1424 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001425 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1426 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001427 } else {
1428 /* it's a dict */
1429 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1430 keys = asdl_seq_new(size, c->c_arena);
1431 if (!keys)
1432 return NULL;
1433
1434 values = asdl_seq_new(size, c->c_arena);
1435 if (!values)
1436 return NULL;
1437
1438 for (i = 0; i < NCH(ch); i += 4) {
1439 expr_ty expression;
1440
1441 expression = ast_for_expr(c, CHILD(ch, i));
1442 if (!expression)
1443 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001444
Guido van Rossum86e58e22006-08-28 15:27:34 +00001445 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001446
Guido van Rossum86e58e22006-08-28 15:27:34 +00001447 expression = ast_for_expr(c, CHILD(ch, i + 2));
1448 if (!expression)
1449 return NULL;
1450
1451 asdl_seq_SET(values, i / 4, expression);
1452 }
1453 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1454 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001457 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1458 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 }
1460}
1461
1462static slice_ty
1463ast_for_slice(struct compiling *c, const node *n)
1464{
1465 node *ch;
1466 expr_ty lower = NULL, upper = NULL, step = NULL;
1467
1468 REQ(n, subscript);
1469
1470 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001471 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 sliceop: ':' [test]
1473 */
1474 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 if (NCH(n) == 1 && TYPE(ch) == test) {
1476 /* 'step' variable hold no significance in terms of being used over
1477 other vars */
1478 step = ast_for_expr(c, ch);
1479 if (!step)
1480 return NULL;
1481
Thomas Wouters89f507f2006-12-13 04:49:30 +00001482 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 }
1484
1485 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001486 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 if (!lower)
1488 return NULL;
1489 }
1490
1491 /* If there's an upper bound it's in the second or third position. */
1492 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001493 if (NCH(n) > 1) {
1494 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495
Thomas Wouters89f507f2006-12-13 04:49:30 +00001496 if (TYPE(n2) == test) {
1497 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 if (!upper)
1499 return NULL;
1500 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001501 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001503 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504
Thomas Wouters89f507f2006-12-13 04:49:30 +00001505 if (TYPE(n2) == test) {
1506 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507 if (!upper)
1508 return NULL;
1509 }
1510 }
1511
1512 ch = CHILD(n, NCH(n) - 1);
1513 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001514 if (NCH(ch) == 1) {
1515 /* No expression, so step is None */
1516 ch = CHILD(ch, 0);
1517 step = Name(new_identifier("None", c->c_arena), Load,
1518 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001519 if (!step)
1520 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001521 } else {
1522 ch = CHILD(ch, 1);
1523 if (TYPE(ch) == test) {
1524 step = ast_for_expr(c, ch);
1525 if (!step)
1526 return NULL;
1527 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001528 }
1529 }
1530
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001531 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532}
1533
1534static expr_ty
1535ast_for_binop(struct compiling *c, const node *n)
1536{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537 /* Must account for a sequence of expressions.
1538 How should A op B op C by represented?
1539 BinOp(BinOp(A, op, B), op, C).
1540 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541
Guido van Rossumd8faa362007-04-27 19:54:29 +00001542 int i, nops;
1543 expr_ty expr1, expr2, result;
1544 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545
Guido van Rossumd8faa362007-04-27 19:54:29 +00001546 expr1 = ast_for_expr(c, CHILD(n, 0));
1547 if (!expr1)
1548 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001549
Guido van Rossumd8faa362007-04-27 19:54:29 +00001550 expr2 = ast_for_expr(c, CHILD(n, 2));
1551 if (!expr2)
1552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553
Guido van Rossumd8faa362007-04-27 19:54:29 +00001554 newoperator = get_operator(CHILD(n, 1));
1555 if (!newoperator)
1556 return NULL;
1557
1558 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1559 c->c_arena);
1560 if (!result)
1561 return NULL;
1562
1563 nops = (NCH(n) - 1) / 2;
1564 for (i = 1; i < nops; i++) {
1565 expr_ty tmp_result, tmp;
1566 const node* next_oper = CHILD(n, i * 2 + 1);
1567
1568 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001569 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570 return NULL;
1571
Guido van Rossumd8faa362007-04-27 19:54:29 +00001572 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1573 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574 return NULL;
1575
Guido van Rossumd8faa362007-04-27 19:54:29 +00001576 tmp_result = BinOp(result, newoperator, tmp,
1577 LINENO(next_oper), next_oper->n_col_offset,
1578 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001579 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001580 return NULL;
1581 result = tmp_result;
1582 }
1583 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584}
1585
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001586static expr_ty
1587ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1588{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001589 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1590 subscriptlist: subscript (',' subscript)* [',']
1591 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1592 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001593 REQ(n, trailer);
1594 if (TYPE(CHILD(n, 0)) == LPAR) {
1595 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001596 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1597 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001598 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001599 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001601 else if (TYPE(CHILD(n, 0)) == DOT ) {
Benjamin Peterson30760062008-11-25 04:02:28 +00001602 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1603 if (!attr_id)
1604 return NULL;
1605 return Attribute(left_expr, attr_id, Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001606 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001607 }
1608 else {
1609 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610 REQ(CHILD(n, 2), RSQB);
1611 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001612 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001613 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1614 if (!slc)
1615 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001616 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1617 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001618 }
1619 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001620 /* The grammar is ambiguous here. The ambiguity is resolved
1621 by treating the sequence as a tuple literal if there are
1622 no slice features.
1623 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001624 int j;
1625 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001626 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001627 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001628 asdl_seq *slices, *elts;
1629 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001630 if (!slices)
1631 return NULL;
1632 for (j = 0; j < NCH(n); j += 2) {
1633 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001634 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001635 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001636 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001637 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001638 asdl_seq_SET(slices, j / 2, slc);
1639 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001640 if (!simple) {
1641 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001642 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001643 }
1644 /* extract Index values and put them in a Tuple */
1645 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001646 if (!elts)
1647 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001648 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1649 slc = (slice_ty)asdl_seq_GET(slices, j);
1650 assert(slc->kind == Index_kind && slc->v.Index.value);
1651 asdl_seq_SET(elts, j, slc->v.Index.value);
1652 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001653 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001654 if (!e)
1655 return NULL;
1656 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001657 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001658 }
1659 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001660}
1661
1662static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001663ast_for_factor(struct compiling *c, const node *n)
1664{
1665 node *pfactor, *ppower, *patom, *pnum;
1666 expr_ty expression;
1667
1668 /* If the unary - operator is applied to a constant, don't generate
1669 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1670 constant. The peephole optimizer already does something like
1671 this but it doesn't handle the case where the constant is
1672 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1673 PyLongObject.
1674 */
1675 if (TYPE(CHILD(n, 0)) == MINUS
1676 && NCH(n) == 2
1677 && TYPE((pfactor = CHILD(n, 1))) == factor
1678 && NCH(pfactor) == 1
1679 && TYPE((ppower = CHILD(pfactor, 0))) == power
1680 && NCH(ppower) == 1
1681 && TYPE((patom = CHILD(ppower, 0))) == atom
1682 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1683 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1684 if (s == NULL)
1685 return NULL;
1686 s[0] = '-';
1687 strcpy(s + 1, STR(pnum));
1688 PyObject_FREE(STR(pnum));
1689 STR(pnum) = s;
1690 return ast_for_atom(c, patom);
1691 }
1692
1693 expression = ast_for_expr(c, CHILD(n, 1));
1694 if (!expression)
1695 return NULL;
1696
1697 switch (TYPE(CHILD(n, 0))) {
1698 case PLUS:
1699 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1700 c->c_arena);
1701 case MINUS:
1702 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1703 c->c_arena);
1704 case TILDE:
1705 return UnaryOp(Invert, expression, LINENO(n),
1706 n->n_col_offset, c->c_arena);
1707 }
1708 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1709 TYPE(CHILD(n, 0)));
1710 return NULL;
1711}
1712
1713static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001714ast_for_power(struct compiling *c, const node *n)
1715{
1716 /* power: atom trailer* ('**' factor)*
1717 */
1718 int i;
1719 expr_ty e, tmp;
1720 REQ(n, power);
1721 e = ast_for_atom(c, CHILD(n, 0));
1722 if (!e)
1723 return NULL;
1724 if (NCH(n) == 1)
1725 return e;
1726 for (i = 1; i < NCH(n); i++) {
1727 node *ch = CHILD(n, i);
1728 if (TYPE(ch) != trailer)
1729 break;
1730 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001731 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001732 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001733 tmp->lineno = e->lineno;
1734 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001735 e = tmp;
1736 }
1737 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1738 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001739 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001740 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001741 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001742 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001743 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001744 e = tmp;
1745 }
1746 return e;
1747}
1748
Guido van Rossum0368b722007-05-11 16:50:42 +00001749static expr_ty
1750ast_for_starred(struct compiling *c, const node *n)
1751{
1752 expr_ty tmp;
1753 REQ(n, star_expr);
1754
1755 tmp = ast_for_expr(c, CHILD(n, 1));
1756 if (!tmp)
1757 return NULL;
1758
1759 /* The Load context is changed later. */
1760 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1761}
1762
1763
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764/* Do not name a variable 'expr'! Will cause a compile error.
1765*/
1766
1767static expr_ty
1768ast_for_expr(struct compiling *c, const node *n)
1769{
1770 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001771 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001772 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001773 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 and_test: not_test ('and' not_test)*
1775 not_test: 'not' not_test | comparison
1776 comparison: expr (comp_op expr)*
1777 expr: xor_expr ('|' xor_expr)*
1778 xor_expr: and_expr ('^' and_expr)*
1779 and_expr: shift_expr ('&' shift_expr)*
1780 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1781 arith_expr: term (('+'|'-') term)*
1782 term: factor (('*'|'/'|'%'|'//') factor)*
1783 factor: ('+'|'-'|'~') factor | power
1784 power: atom trailer* ('**' factor)*
1785 */
1786
1787 asdl_seq *seq;
1788 int i;
1789
1790 loop:
1791 switch (TYPE(n)) {
1792 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001793 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001794 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001795 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001797 else if (NCH(n) > 1)
1798 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001799 /* Fallthrough */
1800 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001801 case and_test:
1802 if (NCH(n) == 1) {
1803 n = CHILD(n, 0);
1804 goto loop;
1805 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001806 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 if (!seq)
1808 return NULL;
1809 for (i = 0; i < NCH(n); i += 2) {
1810 expr_ty e = ast_for_expr(c, CHILD(n, i));
1811 if (!e)
1812 return NULL;
1813 asdl_seq_SET(seq, i / 2, e);
1814 }
1815 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1817 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001818 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001819 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 case not_test:
1821 if (NCH(n) == 1) {
1822 n = CHILD(n, 0);
1823 goto loop;
1824 }
1825 else {
1826 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1827 if (!expression)
1828 return NULL;
1829
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001830 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1831 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 }
1833 case comparison:
1834 if (NCH(n) == 1) {
1835 n = CHILD(n, 0);
1836 goto loop;
1837 }
1838 else {
1839 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001842 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 if (!ops)
1844 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001845 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 return NULL;
1848 }
1849 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001850 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001852 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001853 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856
1857 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001858 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001860 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001862 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 asdl_seq_SET(cmps, i / 2, expression);
1864 }
1865 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001866 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001870 return Compare(expression, ops, cmps, LINENO(n),
1871 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001872 }
1873 break;
1874
Guido van Rossum0368b722007-05-11 16:50:42 +00001875 case star_expr:
1876 if (TYPE(CHILD(n, 0)) == STAR) {
1877 return ast_for_starred(c, n);
1878 }
1879 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 /* The next five cases all handle BinOps. The main body of code
1881 is the same in each case, but the switch turned inside out to
1882 reuse the code for each type of operator.
1883 */
1884 case expr:
1885 case xor_expr:
1886 case and_expr:
1887 case shift_expr:
1888 case arith_expr:
1889 case term:
1890 if (NCH(n) == 1) {
1891 n = CHILD(n, 0);
1892 goto loop;
1893 }
1894 return ast_for_binop(c, n);
1895 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 expr_ty exp = NULL;
1897 if (NCH(n) == 2) {
1898 exp = ast_for_testlist(c, CHILD(n, 1));
1899 if (!exp)
1900 return NULL;
1901 }
1902 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1903 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001904 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 if (NCH(n) == 1) {
1906 n = CHILD(n, 0);
1907 goto loop;
1908 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001909 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001910 case power:
1911 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001913 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 return NULL;
1915 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001916 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917 return NULL;
1918}
1919
1920static expr_ty
1921ast_for_call(struct compiling *c, const node *n, expr_ty func)
1922{
1923 /*
1924 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1925 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001926 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 */
1928
1929 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001930 asdl_seq *args;
1931 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 expr_ty vararg = NULL, kwarg = NULL;
1933
1934 REQ(n, arglist);
1935
1936 nargs = 0;
1937 nkeywords = 0;
1938 ngens = 0;
1939 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001940 node *ch = CHILD(n, i);
1941 if (TYPE(ch) == argument) {
1942 if (NCH(ch) == 1)
1943 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001944 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001945 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001947 nkeywords++;
1948 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 }
1950 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001951 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001952 "if not sole argument");
1953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 }
1955
1956 if (nargs + nkeywords + ngens > 255) {
1957 ast_error(n, "more than 255 arguments");
1958 return NULL;
1959 }
1960
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001961 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001963 return NULL;
1964 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001966 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 nargs = 0;
1968 nkeywords = 0;
1969 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 node *ch = CHILD(n, i);
1971 if (TYPE(ch) == argument) {
1972 expr_ty e;
1973 if (NCH(ch) == 1) {
1974 if (nkeywords) {
1975 ast_error(CHILD(ch, 0),
1976 "non-keyword arg after keyword arg");
1977 return NULL;
1978 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001979 if (vararg) {
1980 ast_error(CHILD(ch, 0),
1981 "only named arguments may follow *expression");
1982 return NULL;
1983 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001984 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001986 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 asdl_seq_SET(args, nargs++, e);
1988 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001989 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001990 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001992 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001993 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001994 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001995 else {
1996 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001997 identifier key, tmp;
1998 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 /* CHILD(ch, 0) is test, but must be an identifier? */
2001 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 /* f(lambda x: x[0] = 3) ends up getting parsed with
2005 * LHS test = lambda x: x[0], and RHS test = 3.
2006 * SF bug 132313 points out that complaining about a keyword
2007 * then is very confusing.
2008 */
2009 if (e->kind == Lambda_kind) {
2010 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002011 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012 } else if (e->kind != Name_kind) {
2013 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002014 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002015 } else if (forbidden_name(e, ch)) {
2016 return NULL;
2017 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002019 for (k = 0; k < nkeywords; k++) {
2020 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2021 if (!PyUnicode_Compare(tmp, key)) {
2022 ast_error(CHILD(ch, 0), "keyword argument repeated");
2023 return NULL;
2024 }
2025 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002028 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002029 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002030 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002031 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 asdl_seq_SET(keywords, nkeywords++, kw);
2033 }
2034 }
2035 else if (TYPE(ch) == STAR) {
2036 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002037 if (!vararg)
2038 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002039 i++;
2040 }
2041 else if (TYPE(ch) == DOUBLESTAR) {
2042 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002043 if (!kwarg)
2044 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 i++;
2046 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 }
2048
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002049 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050}
2051
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002053ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002055 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002056 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002057 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002058 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002059 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002060 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002061 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062 }
2063 else {
2064 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002065 TYPE(n) == testlist1);
2066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002068 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 else {
2070 asdl_seq *tmp = seq_for_testlist(c, n);
2071 if (!tmp)
2072 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002073 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002075}
2076
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077static stmt_ty
2078ast_for_expr_stmt(struct compiling *c, const node *n)
2079{
2080 REQ(n, expr_stmt);
2081 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2082 | ('=' (yield_expr|testlist))*)
2083 testlist: test (',' test)* [',']
2084 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 test: ... here starts the operator precendence dance
2087 */
2088
2089 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002090 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 if (!e)
2092 return NULL;
2093
Thomas Wouters89f507f2006-12-13 04:49:30 +00002094 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 }
2096 else if (TYPE(CHILD(n, 1)) == augassign) {
2097 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002098 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002099 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 if (!expr1)
2103 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002104 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002105 switch (expr1->kind) {
2106 case GeneratorExp_kind:
2107 ast_error(ch, "augmented assignment to generator "
2108 "expression not possible");
2109 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002110 case Yield_kind:
2111 ast_error(ch, "augmented assignment to yield "
2112 "expression not possible");
2113 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002114 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002115 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002116 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002117 break;
2118 }
2119 case Attribute_kind:
2120 case Subscript_kind:
2121 break;
2122 default:
2123 ast_error(ch, "illegal expression for augmented "
2124 "assignment");
2125 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002127 if(!set_context(c, expr1, Store, ch))
2128 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129
Thomas Wouters89f507f2006-12-13 04:49:30 +00002130 ch = CHILD(n, 2);
2131 if (TYPE(ch) == testlist)
2132 expr2 = ast_for_testlist(c, ch);
2133 else
2134 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002135 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 return NULL;
2137
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002138 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002139 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 return NULL;
2141
Thomas Wouters89f507f2006-12-13 04:49:30 +00002142 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 }
2144 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 int i;
2146 asdl_seq *targets;
2147 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002148 expr_ty expression;
2149
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 /* a normal assignment */
2151 REQ(CHILD(n, 1), EQUAL);
2152 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2153 if (!targets)
2154 return NULL;
2155 for (i = 0; i < NCH(n) - 2; i += 2) {
2156 expr_ty e;
2157 node *ch = CHILD(n, i);
2158 if (TYPE(ch) == yield_expr) {
2159 ast_error(ch, "assignment to yield expression not possible");
2160 return NULL;
2161 }
2162 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163
Thomas Wouters89f507f2006-12-13 04:49:30 +00002164 /* set context to assign */
2165 if (!e)
2166 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002168 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002169 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 asdl_seq_SET(targets, i / 2, e);
2172 }
2173 value = CHILD(n, NCH(n) - 1);
2174 if (TYPE(value) == testlist)
2175 expression = ast_for_testlist(c, value);
2176 else
2177 expression = ast_for_expr(c, value);
2178 if (!expression)
2179 return NULL;
2180 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182}
2183
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002184static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002185ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002186{
2187 asdl_seq *seq;
2188 int i;
2189 expr_ty e;
2190
2191 REQ(n, exprlist);
2192
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002193 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002195 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002196 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002197 e = ast_for_expr(c, CHILD(n, i));
2198 if (!e)
2199 return NULL;
2200 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002201 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002202 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203 }
2204 return seq;
2205}
2206
2207static stmt_ty
2208ast_for_del_stmt(struct compiling *c, const node *n)
2209{
2210 asdl_seq *expr_list;
2211
2212 /* del_stmt: 'del' exprlist */
2213 REQ(n, del_stmt);
2214
2215 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2216 if (!expr_list)
2217 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002218 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002219}
2220
2221static stmt_ty
2222ast_for_flow_stmt(struct compiling *c, const node *n)
2223{
2224 /*
2225 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2226 | yield_stmt
2227 break_stmt: 'break'
2228 continue_stmt: 'continue'
2229 return_stmt: 'return' [testlist]
2230 yield_stmt: yield_expr
2231 yield_expr: 'yield' testlist
2232 raise_stmt: 'raise' [test [',' test [',' test]]]
2233 */
2234 node *ch;
2235
2236 REQ(n, flow_stmt);
2237 ch = CHILD(n, 0);
2238 switch (TYPE(ch)) {
2239 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002240 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002244 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2245 if (!exp)
2246 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002247 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 }
2249 case return_stmt:
2250 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002251 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002253 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002254 if (!expression)
2255 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002256 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257 }
2258 case raise_stmt:
2259 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002260 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2261 else if (NCH(ch) >= 2) {
2262 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2264 if (!expression)
2265 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002266 if (NCH(ch) == 4) {
2267 cause = ast_for_expr(c, CHILD(ch, 3));
2268 if (!cause)
2269 return NULL;
2270 }
2271 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272 }
2273 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002274 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 "unexpected flow_stmt: %d", TYPE(ch));
2276 return NULL;
2277 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002278
2279 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2280 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281}
2282
2283static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002284alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285{
2286 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002287 import_as_name: NAME ['as' NAME]
2288 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 dotted_name: NAME ('.' NAME)*
2290 */
Benjamin Peterson30760062008-11-25 04:02:28 +00002291 PyObject *str, *name;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002292
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 loop:
2294 switch (TYPE(n)) {
2295 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002296 str = NULL;
2297 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002298 str = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002299 if (!str)
2300 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002301 }
Benjamin Peterson30760062008-11-25 04:02:28 +00002302 name = NEW_IDENTIFIER(CHILD(n, 0));
2303 if (!name)
2304 return NULL;
2305 return alias(name, str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 case dotted_as_name:
2307 if (NCH(n) == 1) {
2308 n = CHILD(n, 0);
2309 goto loop;
2310 }
2311 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002312 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002313 if (!a)
2314 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002315 assert(!a->asname);
2316 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
Benjamin Peterson30760062008-11-25 04:02:28 +00002317 if (!a->asname)
2318 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 return a;
2320 }
2321 break;
2322 case dotted_name:
Benjamin Peterson30760062008-11-25 04:02:28 +00002323 if (NCH(n) == 1) {
2324 name = NEW_IDENTIFIER(CHILD(n, 0));
2325 if (!name)
2326 return NULL;
2327 return alias(name, NULL, c->c_arena);
2328 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329 else {
2330 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002331 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002332 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002334 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335
2336 len = 0;
2337 for (i = 0; i < NCH(n); i += 2)
2338 /* length of string plus one for the dot */
2339 len += strlen(STR(CHILD(n, i))) + 1;
2340 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002341 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002342 if (!str)
2343 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002344 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345 if (!s)
2346 return NULL;
2347 for (i = 0; i < NCH(n); i += 2) {
2348 char *sch = STR(CHILD(n, i));
2349 strcpy(s, STR(CHILD(n, i)));
2350 s += strlen(sch);
2351 *s++ = '.';
2352 }
2353 --s;
2354 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002355 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2356 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002357 NULL);
2358 Py_DECREF(str);
2359 if (!uni)
2360 return NULL;
2361 str = uni;
2362 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002364 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 }
2366 break;
2367 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002368 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002370 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002372 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 "unexpected import name: %d", TYPE(n));
2374 return NULL;
2375 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002376
2377 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 return NULL;
2379}
2380
2381static stmt_ty
2382ast_for_import_stmt(struct compiling *c, const node *n)
2383{
2384 /*
2385 import_stmt: import_name | import_from
2386 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002387 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2388 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002390 int lineno;
2391 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002392 int i;
2393 asdl_seq *aliases;
2394
2395 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002396 lineno = LINENO(n);
2397 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002399 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002401 REQ(n, dotted_as_names);
2402 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2403 if (!aliases)
2404 return NULL;
2405 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002406 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002407 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002409 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002411 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002413 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 int idx, ndots = 0;
2416 alias_ty mod = NULL;
2417 identifier modname;
2418
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002419 /* Count the number of dots (for relative imports) and check for the
2420 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002421 for (idx = 1; idx < NCH(n); idx++) {
2422 if (TYPE(CHILD(n, idx)) == dotted_name) {
2423 mod = alias_for_import_name(c, CHILD(n, idx));
2424 idx++;
2425 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002426 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2427 /* three consecutive dots are tokenized as one ELLIPSIS */
2428 ndots += 3;
2429 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 } else if (TYPE(CHILD(n, idx)) != DOT) {
2431 break;
2432 }
2433 ndots++;
2434 }
2435 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002436 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002437 case STAR:
2438 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002439 n = CHILD(n, idx);
2440 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 break;
2442 case LPAR:
2443 /* from ... import (x, y, z) */
2444 n = CHILD(n, idx + 1);
2445 n_children = NCH(n);
2446 break;
2447 case import_as_names:
2448 /* from ... import x, y, z */
2449 n = CHILD(n, idx);
2450 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002451 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 ast_error(n, "trailing comma not allowed without"
2453 " surrounding parentheses");
2454 return NULL;
2455 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002456 break;
2457 default:
2458 ast_error(n, "Unexpected node-type in from-import");
2459 return NULL;
2460 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461
Thomas Wouters89f507f2006-12-13 04:49:30 +00002462 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2463 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465
2466 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002467 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002468 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002469 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002471 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002473 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002474 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002475 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2476 if (!import_alias)
2477 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002478 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002479 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002481 if (mod != NULL)
2482 modname = mod->name;
2483 else
2484 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002485 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002486 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Neal Norwitz79792652005-11-14 04:25:03 +00002488 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 "unknown import statement: starts with command '%s'",
2490 STR(CHILD(n, 0)));
2491 return NULL;
2492}
2493
2494static stmt_ty
2495ast_for_global_stmt(struct compiling *c, const node *n)
2496{
2497 /* global_stmt: 'global' NAME (',' NAME)* */
2498 identifier name;
2499 asdl_seq *s;
2500 int i;
2501
2502 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002503 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002505 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002506 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002507 name = NEW_IDENTIFIER(CHILD(n, i));
2508 if (!name)
2509 return NULL;
2510 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002512 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513}
2514
2515static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002516ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2517{
2518 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2519 identifier name;
2520 asdl_seq *s;
2521 int i;
2522
2523 REQ(n, nonlocal_stmt);
2524 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2525 if (!s)
2526 return NULL;
2527 for (i = 1; i < NCH(n); i += 2) {
2528 name = NEW_IDENTIFIER(CHILD(n, i));
2529 if (!name)
2530 return NULL;
2531 asdl_seq_SET(s, i / 2, name);
2532 }
2533 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2534}
2535
2536static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537ast_for_assert_stmt(struct compiling *c, const node *n)
2538{
2539 /* assert_stmt: 'assert' test [',' test] */
2540 REQ(n, assert_stmt);
2541 if (NCH(n) == 2) {
2542 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2543 if (!expression)
2544 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002545 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 }
2547 else if (NCH(n) == 4) {
2548 expr_ty expr1, expr2;
2549
2550 expr1 = ast_for_expr(c, CHILD(n, 1));
2551 if (!expr1)
2552 return NULL;
2553 expr2 = ast_for_expr(c, CHILD(n, 3));
2554 if (!expr2)
2555 return NULL;
2556
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002558 }
Neal Norwitz79792652005-11-14 04:25:03 +00002559 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560 "improper number of parts to 'assert' statement: %d",
2561 NCH(n));
2562 return NULL;
2563}
2564
2565static asdl_seq *
2566ast_for_suite(struct compiling *c, const node *n)
2567{
2568 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002569 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 stmt_ty s;
2571 int i, total, num, end, pos = 0;
2572 node *ch;
2573
2574 REQ(n, suite);
2575
2576 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002577 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002579 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002581 n = CHILD(n, 0);
2582 /* simple_stmt always ends with a NEWLINE,
2583 and may have a trailing SEMI
2584 */
2585 end = NCH(n) - 1;
2586 if (TYPE(CHILD(n, end - 1)) == SEMI)
2587 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002589 for (i = 0; i < end; i += 2) {
2590 ch = CHILD(n, i);
2591 s = ast_for_stmt(c, ch);
2592 if (!s)
2593 return NULL;
2594 asdl_seq_SET(seq, pos++, s);
2595 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 }
2597 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002598 for (i = 2; i < (NCH(n) - 1); i++) {
2599 ch = CHILD(n, i);
2600 REQ(ch, stmt);
2601 num = num_stmts(ch);
2602 if (num == 1) {
2603 /* small_stmt or compound_stmt with only one child */
2604 s = ast_for_stmt(c, ch);
2605 if (!s)
2606 return NULL;
2607 asdl_seq_SET(seq, pos++, s);
2608 }
2609 else {
2610 int j;
2611 ch = CHILD(ch, 0);
2612 REQ(ch, simple_stmt);
2613 for (j = 0; j < NCH(ch); j += 2) {
2614 /* statement terminates with a semi-colon ';' */
2615 if (NCH(CHILD(ch, j)) == 0) {
2616 assert((j + 1) == NCH(ch));
2617 break;
2618 }
2619 s = ast_for_stmt(c, CHILD(ch, j));
2620 if (!s)
2621 return NULL;
2622 asdl_seq_SET(seq, pos++, s);
2623 }
2624 }
2625 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627 assert(pos == seq->size);
2628 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629}
2630
2631static stmt_ty
2632ast_for_if_stmt(struct compiling *c, const node *n)
2633{
2634 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2635 ['else' ':' suite]
2636 */
2637 char *s;
2638
2639 REQ(n, if_stmt);
2640
2641 if (NCH(n) == 4) {
2642 expr_ty expression;
2643 asdl_seq *suite_seq;
2644
2645 expression = ast_for_expr(c, CHILD(n, 1));
2646 if (!expression)
2647 return NULL;
2648 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002649 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 return NULL;
2651
Guido van Rossumd8faa362007-04-27 19:54:29 +00002652 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2653 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002655
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 s = STR(CHILD(n, 4));
2657 /* s[2], the third character in the string, will be
2658 's' for el_s_e, or
2659 'i' for el_i_f
2660 */
2661 if (s[2] == 's') {
2662 expr_ty expression;
2663 asdl_seq *seq1, *seq2;
2664
2665 expression = ast_for_expr(c, CHILD(n, 1));
2666 if (!expression)
2667 return NULL;
2668 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002669 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return NULL;
2671 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002672 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673 return NULL;
2674
Guido van Rossumd8faa362007-04-27 19:54:29 +00002675 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2676 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 }
2678 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002679 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 expr_ty expression;
2681 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 asdl_seq *orelse = NULL;
2683 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684 /* must reference the child n_elif+1 since 'else' token is third,
2685 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2687 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2688 has_else = 1;
2689 n_elif -= 3;
2690 }
2691 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002694 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 orelse = asdl_seq_new(1, c->c_arena);
2697 if (!orelse)
2698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002700 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002702 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2703 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002705 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2706 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708
Guido van Rossumd8faa362007-04-27 19:54:29 +00002709 asdl_seq_SET(orelse, 0,
2710 If(expression, suite_seq, suite_seq2,
2711 LINENO(CHILD(n, NCH(n) - 6)),
2712 CHILD(n, NCH(n) - 6)->n_col_offset,
2713 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002714 /* the just-created orelse handled the last elif */
2715 n_elif--;
2716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717
Thomas Wouters89f507f2006-12-13 04:49:30 +00002718 for (i = 0; i < n_elif; i++) {
2719 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002720 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2721 if (!newobj)
2722 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002724 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002727 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 asdl_seq_SET(newobj, 0,
2731 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002732 LINENO(CHILD(n, off)),
2733 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002734 orelse = newobj;
2735 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002736 expression = ast_for_expr(c, CHILD(n, 1));
2737 if (!expression)
2738 return NULL;
2739 suite_seq = ast_for_suite(c, CHILD(n, 3));
2740 if (!suite_seq)
2741 return NULL;
2742 return If(expression, suite_seq, orelse,
2743 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002745
2746 PyErr_Format(PyExc_SystemError,
2747 "unexpected token in 'if' statement: %s", s);
2748 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749}
2750
2751static stmt_ty
2752ast_for_while_stmt(struct compiling *c, const node *n)
2753{
2754 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2755 REQ(n, while_stmt);
2756
2757 if (NCH(n) == 4) {
2758 expr_ty expression;
2759 asdl_seq *suite_seq;
2760
2761 expression = ast_for_expr(c, CHILD(n, 1));
2762 if (!expression)
2763 return NULL;
2764 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002765 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002767 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 }
2769 else if (NCH(n) == 7) {
2770 expr_ty expression;
2771 asdl_seq *seq1, *seq2;
2772
2773 expression = ast_for_expr(c, CHILD(n, 1));
2774 if (!expression)
2775 return NULL;
2776 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002777 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002778 return NULL;
2779 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002780 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781 return NULL;
2782
Thomas Wouters89f507f2006-12-13 04:49:30 +00002783 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785
2786 PyErr_Format(PyExc_SystemError,
2787 "wrong number of tokens for 'while' statement: %d",
2788 NCH(n));
2789 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790}
2791
2792static stmt_ty
2793ast_for_for_stmt(struct compiling *c, const node *n)
2794{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002795 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 expr_ty expression;
2797 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002798 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2800 REQ(n, for_stmt);
2801
2802 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002803 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804 if (!seq)
2805 return NULL;
2806 }
2807
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002808 node_target = CHILD(n, 1);
2809 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002810 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002812 /* Check the # of children rather than the length of _target, since
2813 for x, in ... has 1 element in _target, but still requires a Tuple. */
2814 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002815 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002817 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002818
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002819 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002820 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 return NULL;
2822 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002823 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824 return NULL;
2825
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002826 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2827 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828}
2829
2830static excepthandler_ty
2831ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2832{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002833 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 REQ(exc, except_clause);
2835 REQ(body, suite);
2836
2837 if (NCH(exc) == 1) {
2838 asdl_seq *suite_seq = ast_for_suite(c, body);
2839 if (!suite_seq)
2840 return NULL;
2841
Neal Norwitzad74aa82008-03-31 05:14:30 +00002842 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002843 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844 }
2845 else if (NCH(exc) == 2) {
2846 expr_ty expression;
2847 asdl_seq *suite_seq;
2848
2849 expression = ast_for_expr(c, CHILD(exc, 1));
2850 if (!expression)
2851 return NULL;
2852 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002853 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854 return NULL;
2855
Neal Norwitzad74aa82008-03-31 05:14:30 +00002856 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002857 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858 }
2859 else if (NCH(exc) == 4) {
2860 asdl_seq *suite_seq;
2861 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002862 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002863 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002866 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867 return NULL;
2868 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002869 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870 return NULL;
2871
Neal Norwitzad74aa82008-03-31 05:14:30 +00002872 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002873 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002874 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002875
2876 PyErr_Format(PyExc_SystemError,
2877 "wrong number of children for 'except' clause: %d",
2878 NCH(exc));
2879 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002880}
2881
2882static stmt_ty
2883ast_for_try_stmt(struct compiling *c, const node *n)
2884{
Neal Norwitzf599f422005-12-17 21:33:47 +00002885 const int nch = NCH(n);
2886 int n_except = (nch - 3)/3;
2887 asdl_seq *body, *orelse = NULL, *finally = NULL;
2888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 REQ(n, try_stmt);
2890
Neal Norwitzf599f422005-12-17 21:33:47 +00002891 body = ast_for_suite(c, CHILD(n, 2));
2892 if (body == NULL)
2893 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894
Neal Norwitzf599f422005-12-17 21:33:47 +00002895 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2896 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2897 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2898 /* we can assume it's an "else",
2899 because nch >= 9 for try-else-finally and
2900 it would otherwise have a type of except_clause */
2901 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2902 if (orelse == NULL)
2903 return NULL;
2904 n_except--;
2905 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002906
Neal Norwitzf599f422005-12-17 21:33:47 +00002907 finally = ast_for_suite(c, CHILD(n, nch - 1));
2908 if (finally == NULL)
2909 return NULL;
2910 n_except--;
2911 }
2912 else {
2913 /* we can assume it's an "else",
2914 otherwise it would have a type of except_clause */
2915 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2916 if (orelse == NULL)
2917 return NULL;
2918 n_except--;
2919 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002921 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002922 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 return NULL;
2924 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002925
2926 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002927 int i;
2928 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002929 /* process except statements to create a try ... except */
2930 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2931 if (handlers == NULL)
2932 return NULL;
2933
2934 for (i = 0; i < n_except; i++) {
2935 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2936 CHILD(n, 5 + i * 3));
2937 if (!e)
2938 return NULL;
2939 asdl_seq_SET(handlers, i, e);
2940 }
2941
Thomas Wouters89f507f2006-12-13 04:49:30 +00002942 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002943 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002944 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002945 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002946
2947 /* if a 'finally' is present too, we nest the TryExcept within a
2948 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002949 body = asdl_seq_new(1, c->c_arena);
2950 if (body == NULL)
2951 return NULL;
2952 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002953 }
2954
2955 /* must be a try ... finally (except clauses are in body, if any exist) */
2956 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002957 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958}
2959
Guido van Rossumc2e20742006-02-27 22:32:47 +00002960static expr_ty
2961ast_for_with_var(struct compiling *c, const node *n)
2962{
2963 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002964 return ast_for_expr(c, CHILD(n, 1));
2965}
2966
2967/* with_stmt: 'with' test [ with_var ] ':' suite */
2968static stmt_ty
2969ast_for_with_stmt(struct compiling *c, const node *n)
2970{
2971 expr_ty context_expr, optional_vars = NULL;
2972 int suite_index = 3; /* skip 'with', test, and ':' */
2973 asdl_seq *suite_seq;
2974
2975 assert(TYPE(n) == with_stmt);
2976 context_expr = ast_for_expr(c, CHILD(n, 1));
2977 if (TYPE(CHILD(n, 2)) == with_var) {
2978 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2979
2980 if (!optional_vars) {
2981 return NULL;
2982 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002983 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002984 return NULL;
2985 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002986 suite_index = 4;
2987 }
2988
2989 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2990 if (!suite_seq) {
2991 return NULL;
2992 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002993 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002995}
2996
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002998ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003000 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
Benjamin Peterson30760062008-11-25 04:02:28 +00003001 PyObject *classname;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003002 asdl_seq *s;
3003 expr_ty call, dummy;
3004
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 REQ(n, classdef);
3006
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003007 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 s = ast_for_suite(c, CHILD(n, 3));
3009 if (!s)
3010 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003011 classname = NEW_IDENTIFIER(CHILD(n, 1));
3012 if (!classname)
3013 return NULL;
3014 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3015 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003017
3018 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003019 s = ast_for_suite(c, CHILD(n,5));
3020 if (!s)
Benjamin Peterson30760062008-11-25 04:02:28 +00003021 return NULL;
3022 classname = NEW_IDENTIFIER(CHILD(n, 1));
3023 if (!classname)
3024 return NULL;
3025 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
3026 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027 }
3028
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003029 /* class NAME '(' arglist ')' ':' suite */
3030 /* build up a fake Call node so we can extract its pieces */
3031 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3032 call = ast_for_call(c, CHILD(n, 3), dummy);
3033 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003036 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 return NULL;
Benjamin Peterson30760062008-11-25 04:02:28 +00003038 classname = NEW_IDENTIFIER(CHILD(n, 1));
3039 if (!classname)
3040 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003041
Benjamin Peterson30760062008-11-25 04:02:28 +00003042 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003043 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003044 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045}
3046
3047static stmt_ty
3048ast_for_stmt(struct compiling *c, const node *n)
3049{
3050 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003051 assert(NCH(n) == 1);
3052 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053 }
3054 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003055 assert(num_stmts(n) == 1);
3056 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 }
3058 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003059 REQ(n, small_stmt);
3060 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003061 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3062 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003063 */
3064 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 case expr_stmt:
3066 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 case del_stmt:
3068 return ast_for_del_stmt(c, n);
3069 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003070 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 case flow_stmt:
3072 return ast_for_flow_stmt(c, n);
3073 case import_stmt:
3074 return ast_for_import_stmt(c, n);
3075 case global_stmt:
3076 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003077 case nonlocal_stmt:
3078 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 case assert_stmt:
3080 return ast_for_assert_stmt(c, n);
3081 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003082 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3084 TYPE(n), NCH(n));
3085 return NULL;
3086 }
3087 }
3088 else {
3089 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003090 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003091 */
3092 node *ch = CHILD(n, 0);
3093 REQ(n, compound_stmt);
3094 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095 case if_stmt:
3096 return ast_for_if_stmt(c, ch);
3097 case while_stmt:
3098 return ast_for_while_stmt(c, ch);
3099 case for_stmt:
3100 return ast_for_for_stmt(c, ch);
3101 case try_stmt:
3102 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003103 case with_stmt:
3104 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003105 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003106 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003107 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003108 return ast_for_classdef(c, ch, NULL);
3109 case decorated:
3110 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003112 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3114 TYPE(n), NCH(n));
3115 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003116 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 }
3118}
3119
3120static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003121parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003123 const char *end;
3124 long x;
3125 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003127 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003128 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129#endif
3130
Guido van Rossumd8faa362007-04-27 19:54:29 +00003131 errno = 0;
3132 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003134 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003136 if (s[0] == '0') {
3137 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3138 if (x < 0 && errno == 0) {
3139 return PyLong_FromString((char *)s,
3140 (char **)0,
3141 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003142 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003143 }
3144 else
3145 x = PyOS_strtol((char *)s, (char **)&end, 0);
3146 if (*end == '\0') {
3147 if (errno != 0)
3148 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003149 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003150 }
3151 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003153 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003154 compl.real = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003155 PyFPE_START_PROTECT("atof", return 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003156 compl.imag = PyOS_ascii_atof(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 PyFPE_END_PROTECT(c)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003158 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 }
3160 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 {
3163 PyFPE_START_PROTECT("atof", return 0)
3164 dx = PyOS_ascii_atof(s);
3165 PyFPE_END_PROTECT(dx)
3166 return PyFloat_FromDouble(dx);
3167 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168}
3169
3170static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003171decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003172{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 PyObject *u, *v;
3174 char *s, *t;
3175 t = s = (char *)*sPtr;
3176 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3177 while (s < end && (*s & 0x80)) s++;
3178 *sPtr = s;
3179 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3180 if (u == NULL)
3181 return NULL;
3182 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3183 Py_DECREF(u);
3184 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185}
3186
3187static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003188decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003190 PyObject *v, *u;
3191 char *buf;
3192 char *p;
3193 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003194
Guido van Rossumd8faa362007-04-27 19:54:29 +00003195 if (encoding == NULL) {
3196 buf = (char *)s;
3197 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003198 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003199 /* check for integer overflow */
3200 if (len > PY_SIZE_MAX / 4)
3201 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003202 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003203 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003204 if (u == NULL)
3205 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003206 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 end = s + len;
3208 while (s < end) {
3209 if (*s == '\\') {
3210 *p++ = *s++;
3211 if (*s & 0x80) {
3212 strcpy(p, "u005c");
3213 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 }
3216 if (*s & 0x80) { /* XXX inefficient */
3217 PyObject *w;
3218 char *r;
3219 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003220 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221 if (w == NULL) {
3222 Py_DECREF(u);
3223 return NULL;
3224 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003225 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003226 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003227 assert(rn % 2 == 0);
3228 for (i = 0; i < rn; i += 2) {
3229 sprintf(p, "\\u%02x%02x",
3230 r[i + 0] & 0xFF,
3231 r[i + 1] & 0xFF);
3232 p += 6;
3233 }
3234 Py_DECREF(w);
3235 } else {
3236 *p++ = *s++;
3237 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003238 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239 len = p - buf;
3240 s = buf;
3241 }
3242 if (rawmode)
3243 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3244 else
3245 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3246 Py_XDECREF(u);
3247 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248}
3249
3250/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003251 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003252 * parsestr parses it, and returns the decoded Python string object.
3253 */
3254static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003255parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003256{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003257 size_t len;
3258 const char *s = STR(n);
3259 int quote = Py_CHARMASK(*s);
3260 int rawmode = 0;
3261 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003262 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 if (quote == 'b' || quote == 'B') {
3264 quote = *++s;
3265 *bytesmode = 1;
3266 }
3267 if (quote == 'r' || quote == 'R') {
3268 quote = *++s;
3269 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003270 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 }
3272 if (quote != '\'' && quote != '\"') {
3273 PyErr_BadInternalCall();
3274 return NULL;
3275 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003276 s++;
3277 len = strlen(s);
3278 if (len > INT_MAX) {
3279 PyErr_SetString(PyExc_OverflowError,
3280 "string to parse is too long");
3281 return NULL;
3282 }
3283 if (s[--len] != quote) {
3284 PyErr_BadInternalCall();
3285 return NULL;
3286 }
3287 if (len >= 4 && s[0] == quote && s[1] == quote) {
3288 s += 2;
3289 len -= 2;
3290 if (s[--len] != quote || s[--len] != quote) {
3291 PyErr_BadInternalCall();
3292 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003293 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003294 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003295 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003296 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003297 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003298 if (*bytesmode) {
3299 /* Disallow non-ascii characters (but not escapes) */
3300 const char *c;
3301 for (c = s; *c; c++) {
3302 if (Py_CHARMASK(*c) >= 0x80) {
3303 ast_error(n, "bytes can only contain ASCII "
3304 "literal characters.");
3305 return NULL;
3306 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003307 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003308 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003309 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003310 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003311 if (rawmode || strchr(s, '\\') == NULL) {
3312 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003313 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003314 if (u == NULL || !*bytesmode)
3315 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003316 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 Py_DECREF(u);
3318 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003319 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003320 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003321 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003322 return PyUnicode_FromStringAndSize(s, len);
3323 } else {
3324 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003325 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003327 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003328 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329}
3330
Guido van Rossum29fd7122007-11-12 01:13:56 +00003331/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332 * compile-time literal catenation, calling parsestr() on each piece, and
3333 * pasting the intermediate results together.
3334 */
3335static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003336parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003338 PyObject *v;
3339 int i;
3340 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003341 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003342 if (v != NULL) {
3343 /* String literal concatenation */
3344 for (i = 1; i < NCH(n); i++) {
3345 PyObject *s;
3346 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003347 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003348 if (s == NULL)
3349 goto onError;
3350 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003351 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003352 goto onError;
3353 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003354 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3355 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003356 if (v == NULL)
3357 goto onError;
3358 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003359 else {
3360 PyObject *temp = PyUnicode_Concat(v, s);
3361 Py_DECREF(s);
3362 Py_DECREF(v);
3363 v = temp;
3364 if (v == NULL)
3365 goto onError;
3366 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003367 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003368 }
3369 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003370
Guido van Rossumd8faa362007-04-27 19:54:29 +00003371 onError:
3372 Py_XDECREF(v);
3373 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374}