blob: 6ec2ef1bc6e72f9523ef882a958305d17eecb05f [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);
Martin v. Löwis47383402007-08-15 07:32:56 +000054 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
55 /* Check whether there are non-ASCII characters in the
56 identifier; if so, normalize to NFKC. */
57 for (; *u; u++) {
58 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000059 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000060 PyObject *id2;
61 if (!m)
62 return NULL;
63 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
64 Py_DECREF(m);
65 if (!id2)
66 return NULL;
67 Py_DECREF(id);
68 id = id2;
69 break;
70 }
71 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000072 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000073 PyArena_AddPyObject(arena, id);
74 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075}
76
Neal Norwitzadb69fc2005-12-17 20:54:49 +000077#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078
79/* This routine provides an invalid object for the syntax error.
80 The outermost routine must unpack this error and create the
81 proper object. We do this so that we don't have to pass
82 the filename to everything function.
83
84 XXX Maybe we should just pass the filename...
85*/
86
87static int
88ast_error(const node *n, const char *errstr)
89{
90 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
91 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 PyErr_SetObject(PyExc_SyntaxError, u);
94 Py_DECREF(u);
95 return 0;
96}
97
98static void
99ast_error_finish(const char *filename)
100{
101 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103
104 assert(PyErr_Occurred());
105 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000106 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 PyErr_Fetch(&type, &value, &tback);
109 errstr = PyTuple_GetItem(value, 0);
110 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000111 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000113 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000114 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 Py_DECREF(errstr);
116 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118 Py_DECREF(value);
119
120 loc = PyErr_ProgramText(filename, lineno);
121 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122 Py_INCREF(Py_None);
123 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000125 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000127 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000128 Py_DECREF(errstr);
129 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 Py_DECREF(errstr);
133 Py_DECREF(tmp);
134 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000135 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136 PyErr_Restore(type, value, tback);
137}
138
139/* num_stmts() returns number of contained statements.
140
141 Use this routine to determine how big a sequence is needed for
142 the statements in a parse tree. Its raison d'etre is this bit of
143 grammar:
144
145 stmt: simple_stmt | compound_stmt
146 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
147
148 A simple_stmt can contain multiple small_stmt elements joined
149 by semicolons. If the arg is a simple_stmt, the number of
150 small_stmt elements is returned.
151*/
152
153static int
154num_stmts(const node *n)
155{
156 int i, l;
157 node *ch;
158
159 switch (TYPE(n)) {
160 case single_input:
161 if (TYPE(CHILD(n, 0)) == NEWLINE)
162 return 0;
163 else
164 return num_stmts(CHILD(n, 0));
165 case file_input:
166 l = 0;
167 for (i = 0; i < NCH(n); i++) {
168 ch = CHILD(n, i);
169 if (TYPE(ch) == stmt)
170 l += num_stmts(ch);
171 }
172 return l;
173 case stmt:
174 return num_stmts(CHILD(n, 0));
175 case compound_stmt:
176 return 1;
177 case simple_stmt:
178 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
179 case suite:
180 if (NCH(n) == 1)
181 return num_stmts(CHILD(n, 0));
182 else {
183 l = 0;
184 for (i = 2; i < (NCH(n) - 1); i++)
185 l += num_stmts(CHILD(n, i));
186 return l;
187 }
188 default: {
189 char buf[128];
190
191 sprintf(buf, "Non-statement found: %d %d\n",
192 TYPE(n), NCH(n));
193 Py_FatalError(buf);
194 }
195 }
196 assert(0);
197 return 0;
198}
199
200/* Transform the CST rooted at node * to the appropriate AST
201*/
202
203mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
205 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000207 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 asdl_seq *stmts = NULL;
209 stmt_ty s;
210 node *ch;
211 struct compiling c;
212
213 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000214 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000215 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000216#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 ast_error(n, "encoding declaration in Unicode string");
218 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000219#endif
220 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 } else if (TYPE(n) == encoding_decl) {
223 c.c_encoding = STR(n);
224 n = CHILD(n, 0);
225 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000226 /* PEP 3120 */
227 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000230 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 switch (TYPE(n)) {
234 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 for (i = 0; i < NCH(n) - 1; i++) {
239 ch = CHILD(n, i);
240 if (TYPE(ch) == NEWLINE)
241 continue;
242 REQ(ch, stmt);
243 num = num_stmts(ch);
244 if (num == 1) {
245 s = ast_for_stmt(&c, ch);
246 if (!s)
247 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000248 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 }
250 else {
251 ch = CHILD(ch, 0);
252 REQ(ch, simple_stmt);
253 for (j = 0; j < num; j++) {
254 s = ast_for_stmt(&c, CHILD(ch, j * 2));
255 if (!s)
256 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000257 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 }
259 }
260 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000261 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 case eval_input: {
263 expr_ty testlist_ast;
264
Nick Coghlan650f0d02007-04-15 12:05:43 +0000265 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000266 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 if (!testlist_ast)
268 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000269 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 }
271 case single_input:
272 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000275 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000276 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
277 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000278 if (!asdl_seq_GET(stmts, 0))
279 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000280 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 else {
283 n = CHILD(n, 0);
284 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000289 s = ast_for_stmt(&c, n);
290 if (!s)
291 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 asdl_seq_SET(stmts, 0, s);
293 }
294 else {
295 /* Only a simple_stmt can contain multiple statements. */
296 REQ(n, simple_stmt);
297 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 if (TYPE(CHILD(n, i)) == NEWLINE)
299 break;
300 s = ast_for_stmt(&c, CHILD(n, i));
301 if (!s)
302 goto error;
303 asdl_seq_SET(stmts, i / 2, s);
304 }
305 }
306
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000307 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308 }
309 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000310 PyErr_Format(PyExc_SystemError,
311 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312 goto error;
313 }
314 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 ast_error_finish(filename);
316 return NULL;
317}
318
319/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
320*/
321
322static operator_ty
323get_operator(const node *n)
324{
325 switch (TYPE(n)) {
326 case VBAR:
327 return BitOr;
328 case CIRCUMFLEX:
329 return BitXor;
330 case AMPER:
331 return BitAnd;
332 case LEFTSHIFT:
333 return LShift;
334 case RIGHTSHIFT:
335 return RShift;
336 case PLUS:
337 return Add;
338 case MINUS:
339 return Sub;
340 case STAR:
341 return Mult;
342 case SLASH:
343 return Div;
344 case DOUBLESLASH:
345 return FloorDiv;
346 case PERCENT:
347 return Mod;
348 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000349 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 }
351}
352
Guido van Rossume7ba4952007-06-06 23:52:48 +0000353static const char* FORBIDDEN[] = {
354 "None",
355 "True",
356 "False",
357 NULL,
358};
359
360static int
361forbidden_name(expr_ty e, const node *n)
362{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000363 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000364 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000366 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 ast_error(n, "assignment to keyword");
368 return 1;
369 }
370 }
371 return 0;
372}
373
Jeremy Hyltona8293132006-02-28 17:58:27 +0000374/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
376 Only sets context for expr kinds that "can appear in assignment context"
377 (according to ../Parser/Python.asdl). For other expr kinds, it sets
378 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379*/
380
381static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000382set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383{
384 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000385 /* If a particular expression type can't be used for assign / delete,
386 set expr_name to its name and an error message will be generated.
387 */
388 const char* expr_name = NULL;
389
390 /* The ast defines augmented store and load contexts, but the
391 implementation here doesn't actually use them. The code may be
392 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000395 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 */
397 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 switch (e->kind) {
400 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 e->v.Attribute.ctx = ctx;
402 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Subscript.ctx = ctx;
405 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000406 case Starred_kind:
407 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000408 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000409 return 0;
410 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000412 if (ctx == Store) {
413 if (forbidden_name(e, n))
414 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 }
416 e->v.Name.ctx = ctx;
417 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 e->v.List.ctx = ctx;
420 s = e->v.List.elts;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Tuple_kind:
423 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
424 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 e->v.Tuple.ctx = ctx;
426 s = e->v.Tuple.elts;
427 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428 case Lambda_kind:
429 expr_name = "lambda";
430 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 case UnaryOp_kind:
437 expr_name = "operator";
438 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 expr_name = "generator expression";
441 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442 case Yield_kind:
443 expr_name = "yield expression";
444 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000445 case ListComp_kind:
446 expr_name = "list comprehension";
447 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000448 case SetComp_kind:
449 expr_name = "set comprehension";
450 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000451 case DictComp_kind:
452 expr_name = "dict comprehension";
453 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000455 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456 case Num_kind:
457 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 expr_name = "literal";
459 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000460 case Ellipsis_kind:
461 expr_name = "Ellipsis";
462 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000463 case Compare_kind:
464 expr_name = "comparison";
465 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 case IfExp_kind:
467 expr_name = "conditional expression";
468 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000469 default:
470 PyErr_Format(PyExc_SystemError,
471 "unexpected expression in assignment %d (line %d)",
472 e->kind, e->lineno);
473 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000475 /* Check for error string set by switch */
476 if (expr_name) {
477 char buf[300];
478 PyOS_snprintf(buf, sizeof(buf),
479 "can't %s %s",
480 ctx == Store ? "assign to" : "delete",
481 expr_name);
482 return ast_error(n, buf);
483 }
484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000486 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 */
488 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000492 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 return 0;
494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 }
496 return 1;
497}
498
499static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000500ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501{
502 REQ(n, augassign);
503 n = CHILD(n, 0);
504 switch (STR(n)[0]) {
505 case '+':
506 return Add;
507 case '-':
508 return Sub;
509 case '/':
510 if (STR(n)[1] == '/')
511 return FloorDiv;
512 else
513 return Div;
514 case '%':
515 return Mod;
516 case '<':
517 return LShift;
518 case '>':
519 return RShift;
520 case '&':
521 return BitAnd;
522 case '^':
523 return BitXor;
524 case '|':
525 return BitOr;
526 case '*':
527 if (STR(n)[1] == '*')
528 return Pow;
529 else
530 return Mult;
531 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000532 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000533 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 }
535}
536
537static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000538ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000540 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 |'is' 'not'
542 */
543 REQ(n, comp_op);
544 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 n = CHILD(n, 0);
546 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 case LESS:
548 return Lt;
549 case GREATER:
550 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return Eq;
553 case LESSEQUAL:
554 return LtE;
555 case GREATEREQUAL:
556 return GtE;
557 case NOTEQUAL:
558 return NotEq;
559 case NAME:
560 if (strcmp(STR(n), "in") == 0)
561 return In;
562 if (strcmp(STR(n), "is") == 0)
563 return Is;
564 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000565 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 }
570 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 /* handle "not in" and "is not" */
572 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 case NAME:
574 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
575 return NotIn;
576 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
577 return IsNot;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
Neal Norwitz79792652005-11-14 04:25:03 +0000584 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587}
588
589static asdl_seq *
590seq_for_testlist(struct compiling *c, const node *n)
591{
592 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000593 asdl_seq *seq;
594 expr_ty expression;
595 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000596 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000598 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 if (!seq)
600 return NULL;
601
602 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000603 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604
605 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 assert(i / 2 < seq->size);
610 asdl_seq_SET(seq, i / 2, expression);
611 }
612 return seq;
613}
614
Neal Norwitzc1505362006-12-28 06:47:50 +0000615static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000616compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000617{
618 identifier name;
619 expr_ty annotation = NULL;
620 node *ch;
621
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000622 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000623 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 name = NEW_IDENTIFIER(ch);
625 if (!name)
626 return NULL;
627
628 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
629 annotation = ast_for_expr(c, CHILD(n, 2));
630 if (!annotation)
631 return NULL;
632 }
633
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000634 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000635#if 0
636 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
637 if (!set_context(c, result, Store, n))
638 return NULL;
639 return result;
640#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000641}
642
Guido van Rossum4f72a782006-10-27 23:31:49 +0000643/* returns -1 if failed to handle keyword only arguments
644 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000645 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000646 ^^^
647 start pointing here
648 */
649static int
650handle_keywordonly_args(struct compiling *c, const node *n, int start,
651 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
652{
653 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000654 expr_ty expression, annotation;
655 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000656 int i = start;
657 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000658
659 if (kwonlyargs == NULL) {
660 ast_error(CHILD(n, start), "named arguments must follow bare *");
661 return -1;
662 }
663 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000664 while (i < NCH(n)) {
665 ch = CHILD(n, i);
666 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000667 case vfpdef:
668 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000669 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000670 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000671 asdl_seq_SET(kwdefaults, j, expression);
672 i += 2; /* '=' and test */
673 }
674 else { /* setting NULL if no default value exists */
675 asdl_seq_SET(kwdefaults, j, NULL);
676 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000677 if (NCH(ch) == 3) {
678 /* ch is NAME ':' test */
679 annotation = ast_for_expr(c, CHILD(ch, 2));
680 if (!annotation) {
681 ast_error(ch, "expected expression");
682 goto error;
683 }
684 }
685 else {
686 annotation = NULL;
687 }
688 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000689 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000690 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000691 ast_error(ch, "expecting name");
692 goto error;
693 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000694 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000695 i += 2; /* the name and the comma */
696 break;
697 case DOUBLESTAR:
698 return i;
699 default:
700 ast_error(ch, "unexpected node");
701 goto error;
702 }
703 }
704 return i;
705 error:
706 return -1;
707}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000708
Jeremy Hyltona8293132006-02-28 17:58:27 +0000709/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710
711static arguments_ty
712ast_for_arguments(struct compiling *c, const node *n)
713{
Neal Norwitzc1505362006-12-28 06:47:50 +0000714 /* This function handles both typedargslist (function definition)
715 and varargslist (lambda definition).
716
717 parameters: '(' [typedargslist] ')'
718 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000719 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
720 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000721 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000722 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000723 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000724 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
725 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000726 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000727 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000729 int i, j, k, nposargs = 0, nkwonlyargs = 0;
730 int nposdefaults = 0, found_default = 0;
731 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000733 arg_ty arg;
734 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735 node *ch;
736
737 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000738 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000739 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
740 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000742 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000743 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744
Guido van Rossum4f72a782006-10-27 23:31:49 +0000745 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 ch = CHILD(n, i);
748 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000749 /* skip star and possible argument */
750 i++;
751 i += (TYPE(CHILD(n, i)) == tfpdef
752 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 break;
754 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000755 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000756 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000757 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 /* count the number of keyword only args &
760 defaults for keyword only args */
761 for ( ; i < NCH(n); ++i) {
762 ch = CHILD(n, i);
763 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000764 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000765 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
767 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000768 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000769 kwonlyargs = (nkwonlyargs ?
770 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
771 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000772 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000773 posdefaults = (nposdefaults ?
774 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
775 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000776 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000777 /* The length of kwonlyargs and kwdefaults are same
778 since we set NULL as default for keyword only argument w/o default
779 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000781 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
782 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000784
785 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000786 ast_error(n, "more than 255 arguments");
787 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000790 /* tfpdef: NAME [':' test]
791 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792 */
793 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000794 j = 0; /* index for defaults */
795 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000797 ch = CHILD(n, i);
798 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000799 case tfpdef:
800 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
802 anything other than EQUAL or a comma? */
803 /* XXX Should NCH(n) check be made a separate check? */
804 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000805 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
806 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 goto error;
808 assert(posdefaults != NULL);
809 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000811 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000813 else if (found_default) {
814 ast_error(n,
815 "non-default argument follows default argument");
816 goto error;
817 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000818 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000819 if (!arg)
820 goto error;
821 asdl_seq_SET(posargs, k++, arg);
822
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000823 i += 2; /* the name and the comma */
824 break;
825 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000826 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000827 ast_error(CHILD(n, i),
828 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000829 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000830 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000831 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000832 if (TYPE(ch) == COMMA) {
833 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000834 i += 2; /* now follows keyword only arguments */
835 res = handle_keywordonly_args(c, n, i,
836 kwonlyargs, kwdefaults);
837 if (res == -1) goto error;
838 i = res; /* res has new position to process */
839 }
840 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000841 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
842 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000843 /* there is an annotation on the vararg */
844 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000845 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000846 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000847 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
848 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000849 int res = 0;
850 res = handle_keywordonly_args(c, n, i,
851 kwonlyargs, kwdefaults);
852 if (res == -1) goto error;
853 i = res; /* res has new position to process */
854 }
855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856 break;
857 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000858 ch = CHILD(n, i+1); /* tfpdef */
859 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000860 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
861 if (NCH(ch) > 1) {
862 /* there is an annotation on the kwarg */
863 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
864 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865 i += 3;
866 break;
867 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000868 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869 "unexpected node in varargslist: %d @ %d",
870 TYPE(ch), i);
871 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000872 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000874 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
875 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000877 Py_XDECREF(vararg);
878 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000879 return NULL;
880}
881
882static expr_ty
883ast_for_dotted_name(struct compiling *c, const node *n)
884{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000885 expr_ty e;
886 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000887 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888 int i;
889
890 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000891
892 lineno = LINENO(n);
893 col_offset = n->n_col_offset;
894
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 id = NEW_IDENTIFIER(CHILD(n, 0));
896 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000897 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000898 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000900 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000901
902 for (i = 2; i < NCH(n); i+=2) {
903 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000904 if (!id)
905 return NULL;
906 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
907 if (!e)
908 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909 }
910
911 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000912}
913
914static expr_ty
915ast_for_decorator(struct compiling *c, const node *n)
916{
917 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
918 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000919 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920
921 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000922 REQ(CHILD(n, 0), AT);
923 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924
925 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
926 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000927 return NULL;
928
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 d = name_expr;
931 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000932 }
933 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000935 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000936 if (!d)
937 return NULL;
938 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 }
940 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 d = ast_for_call(c, CHILD(n, 3), name_expr);
942 if (!d)
943 return NULL;
944 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000945 }
946
947 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948}
949
950static asdl_seq*
951ast_for_decorators(struct compiling *c, const node *n)
952{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000953 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000954 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 int i;
956
957 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000958 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959 if (!decorator_seq)
960 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000961
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000963 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000964 if (!d)
965 return NULL;
966 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967 }
968 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969}
970
971static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000972ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000974 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000975 identifier name;
976 arguments_ty args;
977 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000978 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000979 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980
981 REQ(n, funcdef);
982
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983 name = NEW_IDENTIFIER(CHILD(n, name_i));
984 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000985 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986 args = ast_for_arguments(c, CHILD(n, name_i + 1));
987 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000988 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000989 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
990 returns = ast_for_expr(c, CHILD(n, name_i + 3));
991 if (!returns)
992 return NULL;
993 name_i += 2;
994 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995 body = ast_for_suite(c, CHILD(n, name_i + 3));
996 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000997 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998
Neal Norwitzc1505362006-12-28 06:47:50 +0000999 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001000 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001001}
1002
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001003static stmt_ty
1004ast_for_decorated(struct compiling *c, const node *n)
1005{
1006 /* decorated: decorators (classdef | funcdef) */
1007 stmt_ty thing = NULL;
1008 asdl_seq *decorator_seq = NULL;
1009
1010 REQ(n, decorated);
1011
1012 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1013 if (!decorator_seq)
1014 return NULL;
1015
1016 assert(TYPE(CHILD(n, 1)) == funcdef ||
1017 TYPE(CHILD(n, 1)) == classdef);
1018
1019 if (TYPE(CHILD(n, 1)) == funcdef) {
1020 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1021 } else if (TYPE(CHILD(n, 1)) == classdef) {
1022 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1023 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001024 /* we count the decorators in when talking about the class' or
1025 * function's line number */
1026 if (thing) {
1027 thing->lineno = LINENO(n);
1028 thing->col_offset = n->n_col_offset;
1029 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001030 return thing;
1031}
1032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033static expr_ty
1034ast_for_lambdef(struct compiling *c, const node *n)
1035{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001036 /* lambdef: 'lambda' [varargslist] ':' test
1037 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 arguments_ty args;
1039 expr_ty expression;
1040
1041 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001042 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1043 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 if (!args)
1045 return NULL;
1046 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001047 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049 }
1050 else {
1051 args = ast_for_arguments(c, CHILD(n, 1));
1052 if (!args)
1053 return NULL;
1054 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001055 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057 }
1058
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001059 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001060}
1061
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001062static expr_ty
1063ast_for_ifexpr(struct compiling *c, const node *n)
1064{
1065 /* test: or_test 'if' or_test 'else' test */
1066 expr_ty expression, body, orelse;
1067
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001068 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001069 body = ast_for_expr(c, CHILD(n, 0));
1070 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001072 expression = ast_for_expr(c, CHILD(n, 2));
1073 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001075 orelse = ast_for_expr(c, CHILD(n, 4));
1076 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001077 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001078 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1079 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001080}
1081
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001082/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084
Nick Coghlan650f0d02007-04-15 12:05:43 +00001085 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086*/
1087
1088static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001089count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092
Guido van Rossumd8faa362007-04-27 19:54:29 +00001093 count_comp_for:
1094 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001095 REQ(n, comp_for);
1096 if (NCH(n) == 5)
1097 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 else
1099 return n_fors;
1100 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001101 REQ(n, comp_iter);
1102 n = CHILD(n, 0);
1103 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001105 else if (TYPE(n) == comp_if) {
1106 if (NCH(n) == 3) {
1107 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 else
1111 return n_fors;
1112 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001113
Guido van Rossumd8faa362007-04-27 19:54:29 +00001114 /* Should never be reached */
1115 PyErr_SetString(PyExc_SystemError,
1116 "logic error in count_comp_fors");
1117 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118}
1119
Nick Coghlan650f0d02007-04-15 12:05:43 +00001120/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121
Nick Coghlan650f0d02007-04-15 12:05:43 +00001122 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123*/
1124
1125static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001126count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129
Guido van Rossumd8faa362007-04-27 19:54:29 +00001130 while (1) {
1131 REQ(n, comp_iter);
1132 if (TYPE(CHILD(n, 0)) == comp_for)
1133 return n_ifs;
1134 n = CHILD(n, 0);
1135 REQ(n, comp_if);
1136 n_ifs++;
1137 if (NCH(n) == 2)
1138 return n_ifs;
1139 n = CHILD(n, 2);
1140 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001141}
1142
Guido van Rossum992d4a32007-07-11 13:09:30 +00001143static asdl_seq *
1144ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001147 asdl_seq *comps;
1148
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001149 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150 if (n_fors == -1)
1151 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001152
Nick Coghlan650f0d02007-04-15 12:05:43 +00001153 comps = asdl_seq_new(n_fors, c->c_arena);
1154 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001158 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 asdl_seq *t;
1160 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001161 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162
Guido van Rossum992d4a32007-07-11 13:09:30 +00001163 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164
Guido van Rossum992d4a32007-07-11 13:09:30 +00001165 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001166 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001169 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001170 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001172
Thomas Wouters89f507f2006-12-13 04:49:30 +00001173 /* Check the # of children rather than the length of t, since
1174 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1175 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001176 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1177 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001179 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001180 c->c_arena),
1181 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001182
Nick Coghlan650f0d02007-04-15 12:05:43 +00001183 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001185
Guido van Rossum992d4a32007-07-11 13:09:30 +00001186 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 int j, n_ifs;
1188 asdl_seq *ifs;
1189
Guido van Rossum992d4a32007-07-11 13:09:30 +00001190 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001191 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194
1195 ifs = asdl_seq_new(n_ifs, c->c_arena);
1196 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001198
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001200 REQ(n, comp_iter);
1201 n = CHILD(n, 0);
1202 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203
Guido van Rossum992d4a32007-07-11 13:09:30 +00001204 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001206 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001207 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001208 if (NCH(n) == 3)
1209 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001211 /* on exit, must guarantee that n is a comp_for */
1212 if (TYPE(n) == comp_iter)
1213 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001214 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001216 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001218 return comps;
1219}
1220
1221static expr_ty
1222ast_for_itercomp(struct compiling *c, const node *n, int type)
1223{
1224 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1225 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1226 expr_ty elt;
1227 asdl_seq *comps;
1228
1229 assert(NCH(n) > 1);
1230
1231 elt = ast_for_expr(c, CHILD(n, 0));
1232 if (!elt)
1233 return NULL;
1234
1235 comps = ast_for_comprehension(c, CHILD(n, 1));
1236 if (!comps)
1237 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001238
1239 if (type == COMP_GENEXP)
1240 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1241 else if (type == COMP_LISTCOMP)
1242 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1243 else if (type == COMP_SETCOMP)
1244 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1245 else
1246 /* Should never happen */
1247 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248}
1249
1250static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001251ast_for_dictcomp(struct compiling *c, const node *n)
1252{
1253 expr_ty key, value;
1254 asdl_seq *comps;
1255
1256 assert(NCH(n) > 3);
1257 REQ(CHILD(n, 1), COLON);
1258
1259 key = ast_for_expr(c, CHILD(n, 0));
1260 if (!key)
1261 return NULL;
1262
1263 value = ast_for_expr(c, CHILD(n, 2));
1264 if (!value)
1265 return NULL;
1266
1267 comps = ast_for_comprehension(c, CHILD(n, 3));
1268 if (!comps)
1269 return NULL;
1270
1271 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1272}
1273
1274static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001275ast_for_genexp(struct compiling *c, const node *n)
1276{
1277 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001278 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001279}
1280
1281static expr_ty
1282ast_for_listcomp(struct compiling *c, const node *n)
1283{
1284 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001285 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001286}
1287
1288static expr_ty
1289ast_for_setcomp(struct compiling *c, const node *n)
1290{
1291 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001292 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001293}
1294
1295
1296static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297ast_for_atom(struct compiling *c, const node *n)
1298{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001299 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1300 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001301 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302 */
1303 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001304 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305
1306 switch (TYPE(ch)) {
1307 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001308 /* All names start in Load context, but may later be
1309 changed. */
1310 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001312 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001313 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001314 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001315 PyObject *type, *value, *tback, *errstr;
1316 PyErr_Fetch(&type, &value, &tback);
1317 errstr = ((PyUnicodeErrorObject *)value)->reason;
1318 if (errstr) {
1319 char *s = "";
1320 char buf[128];
Amaury Forgeot d'Arc39599dc2007-11-22 02:48:12 +00001321 s = PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001322 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1323 ast_error(n, buf);
1324 } else {
1325 ast_error(n, "(unicode error) unknown error");
1326 }
1327 Py_DECREF(type);
1328 Py_DECREF(value);
1329 Py_XDECREF(tback);
1330 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001331 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001333 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001334 if (bytesmode)
1335 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1336 else
1337 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338 }
1339 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001340 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 if (!pynum)
1342 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001343
Thomas Wouters89f507f2006-12-13 04:49:30 +00001344 PyArena_AddPyObject(c->c_arena, pynum);
1345 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 }
Georg Brandldde00282007-03-18 19:01:53 +00001347 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001348 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001350 ch = CHILD(n, 1);
1351
1352 if (TYPE(ch) == RPAR)
1353 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1354
1355 if (TYPE(ch) == yield_expr)
1356 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001357
1358 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1359 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001360 return ast_for_genexp(c, ch);
1361
Nick Coghlan650f0d02007-04-15 12:05:43 +00001362 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 ch = CHILD(n, 1);
1365
1366 if (TYPE(ch) == RSQB)
1367 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1368
Nick Coghlan650f0d02007-04-15 12:05:43 +00001369 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001370 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1371 asdl_seq *elts = seq_for_testlist(c, ch);
1372 if (!elts)
1373 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001374
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1376 }
1377 else
1378 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001380 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1381 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001382 int i, size;
1383 asdl_seq *keys, *values;
1384
1385 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001386 if (TYPE(ch) == RBRACE) {
1387 /* it's an empty dict */
1388 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1389 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1390 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001391 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001392 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001393 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001394 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001395 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001396 for (i = 0; i < NCH(ch); i += 2) {
1397 expr_ty expression;
1398 expression = ast_for_expr(c, CHILD(ch, i));
1399 if (!expression)
1400 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001401 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001402 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001403 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1404 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1405 /* it's a set comprehension */
1406 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001407 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1408 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001409 } else {
1410 /* it's a dict */
1411 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1412 keys = asdl_seq_new(size, c->c_arena);
1413 if (!keys)
1414 return NULL;
1415
1416 values = asdl_seq_new(size, c->c_arena);
1417 if (!values)
1418 return NULL;
1419
1420 for (i = 0; i < NCH(ch); i += 4) {
1421 expr_ty expression;
1422
1423 expression = ast_for_expr(c, CHILD(ch, i));
1424 if (!expression)
1425 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001426
Guido van Rossum86e58e22006-08-28 15:27:34 +00001427 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001428
Guido van Rossum86e58e22006-08-28 15:27:34 +00001429 expression = ast_for_expr(c, CHILD(ch, i + 2));
1430 if (!expression)
1431 return NULL;
1432
1433 asdl_seq_SET(values, i / 4, expression);
1434 }
1435 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1436 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001439 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441 }
1442}
1443
1444static slice_ty
1445ast_for_slice(struct compiling *c, const node *n)
1446{
1447 node *ch;
1448 expr_ty lower = NULL, upper = NULL, step = NULL;
1449
1450 REQ(n, subscript);
1451
1452 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001453 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 sliceop: ':' [test]
1455 */
1456 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457 if (NCH(n) == 1 && TYPE(ch) == test) {
1458 /* 'step' variable hold no significance in terms of being used over
1459 other vars */
1460 step = ast_for_expr(c, ch);
1461 if (!step)
1462 return NULL;
1463
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 }
1466
1467 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001468 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 if (!lower)
1470 return NULL;
1471 }
1472
1473 /* If there's an upper bound it's in the second or third position. */
1474 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001475 if (NCH(n) > 1) {
1476 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477
Thomas Wouters89f507f2006-12-13 04:49:30 +00001478 if (TYPE(n2) == test) {
1479 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 if (!upper)
1481 return NULL;
1482 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001486
Thomas Wouters89f507f2006-12-13 04:49:30 +00001487 if (TYPE(n2) == test) {
1488 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001489 if (!upper)
1490 return NULL;
1491 }
1492 }
1493
1494 ch = CHILD(n, NCH(n) - 1);
1495 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001496 if (NCH(ch) == 1) {
1497 /* No expression, so step is None */
1498 ch = CHILD(ch, 0);
1499 step = Name(new_identifier("None", c->c_arena), Load,
1500 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501 if (!step)
1502 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503 } else {
1504 ch = CHILD(ch, 1);
1505 if (TYPE(ch) == test) {
1506 step = ast_for_expr(c, ch);
1507 if (!step)
1508 return NULL;
1509 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 }
1511 }
1512
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001513 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514}
1515
1516static expr_ty
1517ast_for_binop(struct compiling *c, const node *n)
1518{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001519 /* Must account for a sequence of expressions.
1520 How should A op B op C by represented?
1521 BinOp(BinOp(A, op, B), op, C).
1522 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001523
Guido van Rossumd8faa362007-04-27 19:54:29 +00001524 int i, nops;
1525 expr_ty expr1, expr2, result;
1526 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527
Guido van Rossumd8faa362007-04-27 19:54:29 +00001528 expr1 = ast_for_expr(c, CHILD(n, 0));
1529 if (!expr1)
1530 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531
Guido van Rossumd8faa362007-04-27 19:54:29 +00001532 expr2 = ast_for_expr(c, CHILD(n, 2));
1533 if (!expr2)
1534 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536 newoperator = get_operator(CHILD(n, 1));
1537 if (!newoperator)
1538 return NULL;
1539
1540 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1541 c->c_arena);
1542 if (!result)
1543 return NULL;
1544
1545 nops = (NCH(n) - 1) / 2;
1546 for (i = 1; i < nops; i++) {
1547 expr_ty tmp_result, tmp;
1548 const node* next_oper = CHILD(n, i * 2 + 1);
1549
1550 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001551 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001552 return NULL;
1553
Guido van Rossumd8faa362007-04-27 19:54:29 +00001554 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1555 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001556 return NULL;
1557
Guido van Rossumd8faa362007-04-27 19:54:29 +00001558 tmp_result = BinOp(result, newoperator, tmp,
1559 LINENO(next_oper), next_oper->n_col_offset,
1560 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001561 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 return NULL;
1563 result = tmp_result;
1564 }
1565 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001566}
1567
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001568static expr_ty
1569ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1570{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001571 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1572 subscriptlist: subscript (',' subscript)* [',']
1573 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1574 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001575 REQ(n, trailer);
1576 if (TYPE(CHILD(n, 0)) == LPAR) {
1577 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001578 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1579 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001580 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001581 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001582 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001583 else if (TYPE(CHILD(n, 0)) == DOT ) {
1584 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001585 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001586 }
1587 else {
1588 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001589 REQ(CHILD(n, 2), RSQB);
1590 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001591 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001592 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1593 if (!slc)
1594 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001595 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1596 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 }
1598 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001599 /* The grammar is ambiguous here. The ambiguity is resolved
1600 by treating the sequence as a tuple literal if there are
1601 no slice features.
1602 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001603 int j;
1604 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001605 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001606 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001607 asdl_seq *slices, *elts;
1608 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001609 if (!slices)
1610 return NULL;
1611 for (j = 0; j < NCH(n); j += 2) {
1612 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001613 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001614 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001615 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001616 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617 asdl_seq_SET(slices, j / 2, slc);
1618 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001619 if (!simple) {
1620 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001621 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001622 }
1623 /* extract Index values and put them in a Tuple */
1624 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001625 if (!elts)
1626 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1628 slc = (slice_ty)asdl_seq_GET(slices, j);
1629 assert(slc->kind == Index_kind && slc->v.Index.value);
1630 asdl_seq_SET(elts, j, slc->v.Index.value);
1631 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001632 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001633 if (!e)
1634 return NULL;
1635 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001636 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001637 }
1638 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001639}
1640
1641static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001642ast_for_factor(struct compiling *c, const node *n)
1643{
1644 node *pfactor, *ppower, *patom, *pnum;
1645 expr_ty expression;
1646
1647 /* If the unary - operator is applied to a constant, don't generate
1648 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1649 constant. The peephole optimizer already does something like
1650 this but it doesn't handle the case where the constant is
1651 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1652 PyLongObject.
1653 */
1654 if (TYPE(CHILD(n, 0)) == MINUS
1655 && NCH(n) == 2
1656 && TYPE((pfactor = CHILD(n, 1))) == factor
1657 && NCH(pfactor) == 1
1658 && TYPE((ppower = CHILD(pfactor, 0))) == power
1659 && NCH(ppower) == 1
1660 && TYPE((patom = CHILD(ppower, 0))) == atom
1661 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1662 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1663 if (s == NULL)
1664 return NULL;
1665 s[0] = '-';
1666 strcpy(s + 1, STR(pnum));
1667 PyObject_FREE(STR(pnum));
1668 STR(pnum) = s;
1669 return ast_for_atom(c, patom);
1670 }
1671
1672 expression = ast_for_expr(c, CHILD(n, 1));
1673 if (!expression)
1674 return NULL;
1675
1676 switch (TYPE(CHILD(n, 0))) {
1677 case PLUS:
1678 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1679 c->c_arena);
1680 case MINUS:
1681 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1682 c->c_arena);
1683 case TILDE:
1684 return UnaryOp(Invert, expression, LINENO(n),
1685 n->n_col_offset, c->c_arena);
1686 }
1687 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1688 TYPE(CHILD(n, 0)));
1689 return NULL;
1690}
1691
1692static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001693ast_for_power(struct compiling *c, const node *n)
1694{
1695 /* power: atom trailer* ('**' factor)*
1696 */
1697 int i;
1698 expr_ty e, tmp;
1699 REQ(n, power);
1700 e = ast_for_atom(c, CHILD(n, 0));
1701 if (!e)
1702 return NULL;
1703 if (NCH(n) == 1)
1704 return e;
1705 for (i = 1; i < NCH(n); i++) {
1706 node *ch = CHILD(n, i);
1707 if (TYPE(ch) != trailer)
1708 break;
1709 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001710 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001711 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001712 tmp->lineno = e->lineno;
1713 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001714 e = tmp;
1715 }
1716 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1717 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001719 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001720 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001721 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001722 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001723 e = tmp;
1724 }
1725 return e;
1726}
1727
Guido van Rossum0368b722007-05-11 16:50:42 +00001728static expr_ty
1729ast_for_starred(struct compiling *c, const node *n)
1730{
1731 expr_ty tmp;
1732 REQ(n, star_expr);
1733
1734 tmp = ast_for_expr(c, CHILD(n, 1));
1735 if (!tmp)
1736 return NULL;
1737
1738 /* The Load context is changed later. */
1739 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1740}
1741
1742
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743/* Do not name a variable 'expr'! Will cause a compile error.
1744*/
1745
1746static expr_ty
1747ast_for_expr(struct compiling *c, const node *n)
1748{
1749 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001750 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001751 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001752 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001753 and_test: not_test ('and' not_test)*
1754 not_test: 'not' not_test | comparison
1755 comparison: expr (comp_op expr)*
1756 expr: xor_expr ('|' xor_expr)*
1757 xor_expr: and_expr ('^' and_expr)*
1758 and_expr: shift_expr ('&' shift_expr)*
1759 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1760 arith_expr: term (('+'|'-') term)*
1761 term: factor (('*'|'/'|'%'|'//') factor)*
1762 factor: ('+'|'-'|'~') factor | power
1763 power: atom trailer* ('**' factor)*
1764 */
1765
1766 asdl_seq *seq;
1767 int i;
1768
1769 loop:
1770 switch (TYPE(n)) {
1771 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001772 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001773 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001774 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001776 else if (NCH(n) > 1)
1777 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001778 /* Fallthrough */
1779 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 case and_test:
1781 if (NCH(n) == 1) {
1782 n = CHILD(n, 0);
1783 goto loop;
1784 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001785 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001786 if (!seq)
1787 return NULL;
1788 for (i = 0; i < NCH(n); i += 2) {
1789 expr_ty e = ast_for_expr(c, CHILD(n, i));
1790 if (!e)
1791 return NULL;
1792 asdl_seq_SET(seq, i / 2, e);
1793 }
1794 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1796 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001797 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001798 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799 case not_test:
1800 if (NCH(n) == 1) {
1801 n = CHILD(n, 0);
1802 goto loop;
1803 }
1804 else {
1805 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1806 if (!expression)
1807 return NULL;
1808
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1810 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811 }
1812 case comparison:
1813 if (NCH(n) == 1) {
1814 n = CHILD(n, 0);
1815 goto loop;
1816 }
1817 else {
1818 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001819 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001820 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822 if (!ops)
1823 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001824 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001825 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 return NULL;
1827 }
1828 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001831 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835
1836 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001837 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001839 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842 asdl_seq_SET(cmps, i / 2, expression);
1843 }
1844 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001845 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001846 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001847 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849 return Compare(expression, ops, cmps, LINENO(n),
1850 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001851 }
1852 break;
1853
Guido van Rossum0368b722007-05-11 16:50:42 +00001854 case star_expr:
1855 if (TYPE(CHILD(n, 0)) == STAR) {
1856 return ast_for_starred(c, n);
1857 }
1858 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 /* The next five cases all handle BinOps. The main body of code
1860 is the same in each case, but the switch turned inside out to
1861 reuse the code for each type of operator.
1862 */
1863 case expr:
1864 case xor_expr:
1865 case and_expr:
1866 case shift_expr:
1867 case arith_expr:
1868 case term:
1869 if (NCH(n) == 1) {
1870 n = CHILD(n, 0);
1871 goto loop;
1872 }
1873 return ast_for_binop(c, n);
1874 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001875 expr_ty exp = NULL;
1876 if (NCH(n) == 2) {
1877 exp = ast_for_testlist(c, CHILD(n, 1));
1878 if (!exp)
1879 return NULL;
1880 }
1881 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1882 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001883 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001884 if (NCH(n) == 1) {
1885 n = CHILD(n, 0);
1886 goto loop;
1887 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001888 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001889 case power:
1890 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001892 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 return NULL;
1894 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001895 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 return NULL;
1897}
1898
1899static expr_ty
1900ast_for_call(struct compiling *c, const node *n, expr_ty func)
1901{
1902 /*
1903 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1904 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001905 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 */
1907
1908 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001909 asdl_seq *args;
1910 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 expr_ty vararg = NULL, kwarg = NULL;
1912
1913 REQ(n, arglist);
1914
1915 nargs = 0;
1916 nkeywords = 0;
1917 ngens = 0;
1918 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001919 node *ch = CHILD(n, i);
1920 if (TYPE(ch) == argument) {
1921 if (NCH(ch) == 1)
1922 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001923 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001924 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001926 nkeywords++;
1927 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928 }
1929 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001930 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001931 "if not sole argument");
1932 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 }
1934
1935 if (nargs + nkeywords + ngens > 255) {
1936 ast_error(n, "more than 255 arguments");
1937 return NULL;
1938 }
1939
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001940 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001942 return NULL;
1943 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001945 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 nargs = 0;
1947 nkeywords = 0;
1948 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001949 node *ch = CHILD(n, i);
1950 if (TYPE(ch) == argument) {
1951 expr_ty e;
1952 if (NCH(ch) == 1) {
1953 if (nkeywords) {
1954 ast_error(CHILD(ch, 0),
1955 "non-keyword arg after keyword arg");
1956 return NULL;
1957 }
1958 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001961 asdl_seq_SET(args, nargs++, e);
1962 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001963 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001964 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001966 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001969 else {
1970 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001971 identifier key, tmp;
1972 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 /* CHILD(ch, 0) is test, but must be an identifier? */
1975 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001977 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 /* f(lambda x: x[0] = 3) ends up getting parsed with
1979 * LHS test = lambda x: x[0], and RHS test = 3.
1980 * SF bug 132313 points out that complaining about a keyword
1981 * then is very confusing.
1982 */
1983 if (e->kind == Lambda_kind) {
1984 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001985 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986 } else if (e->kind != Name_kind) {
1987 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001989 } else if (forbidden_name(e, ch)) {
1990 return NULL;
1991 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001993 for (k = 0; k < nkeywords; k++) {
1994 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
1995 if (!PyUnicode_Compare(tmp, key)) {
1996 ast_error(CHILD(ch, 0), "keyword argument repeated");
1997 return NULL;
1998 }
1999 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002000 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002002 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002003 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002005 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002006 asdl_seq_SET(keywords, nkeywords++, kw);
2007 }
2008 }
2009 else if (TYPE(ch) == STAR) {
2010 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002011 if (!vararg)
2012 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 i++;
2014 }
2015 else if (TYPE(ch) == DOUBLESTAR) {
2016 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002017 if (!kwarg)
2018 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 i++;
2020 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002021 }
2022
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002023 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024}
2025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002027ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002029 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002030 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002031 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002032 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002033 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002034 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002035 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002036 }
2037 else {
2038 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002039 TYPE(n) == testlist1);
2040 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002042 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002043 else {
2044 asdl_seq *tmp = seq_for_testlist(c, n);
2045 if (!tmp)
2046 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002047 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002049}
2050
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051static stmt_ty
2052ast_for_expr_stmt(struct compiling *c, const node *n)
2053{
2054 REQ(n, expr_stmt);
2055 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2056 | ('=' (yield_expr|testlist))*)
2057 testlist: test (',' test)* [',']
2058 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 test: ... here starts the operator precendence dance
2061 */
2062
2063 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002064 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 if (!e)
2066 return NULL;
2067
Thomas Wouters89f507f2006-12-13 04:49:30 +00002068 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 }
2070 else if (TYPE(CHILD(n, 1)) == augassign) {
2071 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002072 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002073 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002074
Thomas Wouters89f507f2006-12-13 04:49:30 +00002075 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076 if (!expr1)
2077 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002078 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002079 switch (expr1->kind) {
2080 case GeneratorExp_kind:
2081 ast_error(ch, "augmented assignment to generator "
2082 "expression not possible");
2083 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002084 case Yield_kind:
2085 ast_error(ch, "augmented assignment to yield "
2086 "expression not possible");
2087 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002088 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002089 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002090 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002091 break;
2092 }
2093 case Attribute_kind:
2094 case Subscript_kind:
2095 break;
2096 default:
2097 ast_error(ch, "illegal expression for augmented "
2098 "assignment");
2099 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002101 if(!set_context(c, expr1, Store, ch))
2102 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103
Thomas Wouters89f507f2006-12-13 04:49:30 +00002104 ch = CHILD(n, 2);
2105 if (TYPE(ch) == testlist)
2106 expr2 = ast_for_testlist(c, ch);
2107 else
2108 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002109 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002110 return NULL;
2111
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002112 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002113 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114 return NULL;
2115
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 }
2118 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002119 int i;
2120 asdl_seq *targets;
2121 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 expr_ty expression;
2123
Thomas Wouters89f507f2006-12-13 04:49:30 +00002124 /* a normal assignment */
2125 REQ(CHILD(n, 1), EQUAL);
2126 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2127 if (!targets)
2128 return NULL;
2129 for (i = 0; i < NCH(n) - 2; i += 2) {
2130 expr_ty e;
2131 node *ch = CHILD(n, i);
2132 if (TYPE(ch) == yield_expr) {
2133 ast_error(ch, "assignment to yield expression not possible");
2134 return NULL;
2135 }
2136 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137
Thomas Wouters89f507f2006-12-13 04:49:30 +00002138 /* set context to assign */
2139 if (!e)
2140 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002142 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002143 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002144
Thomas Wouters89f507f2006-12-13 04:49:30 +00002145 asdl_seq_SET(targets, i / 2, e);
2146 }
2147 value = CHILD(n, NCH(n) - 1);
2148 if (TYPE(value) == testlist)
2149 expression = ast_for_testlist(c, value);
2150 else
2151 expression = ast_for_expr(c, value);
2152 if (!expression)
2153 return NULL;
2154 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156}
2157
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002159ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160{
2161 asdl_seq *seq;
2162 int i;
2163 expr_ty e;
2164
2165 REQ(n, exprlist);
2166
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002167 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002169 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002171 e = ast_for_expr(c, CHILD(n, i));
2172 if (!e)
2173 return NULL;
2174 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002175 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002176 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177 }
2178 return seq;
2179}
2180
2181static stmt_ty
2182ast_for_del_stmt(struct compiling *c, const node *n)
2183{
2184 asdl_seq *expr_list;
2185
2186 /* del_stmt: 'del' exprlist */
2187 REQ(n, del_stmt);
2188
2189 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2190 if (!expr_list)
2191 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002192 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193}
2194
2195static stmt_ty
2196ast_for_flow_stmt(struct compiling *c, const node *n)
2197{
2198 /*
2199 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2200 | yield_stmt
2201 break_stmt: 'break'
2202 continue_stmt: 'continue'
2203 return_stmt: 'return' [testlist]
2204 yield_stmt: yield_expr
2205 yield_expr: 'yield' testlist
2206 raise_stmt: 'raise' [test [',' test [',' test]]]
2207 */
2208 node *ch;
2209
2210 REQ(n, flow_stmt);
2211 ch = CHILD(n, 0);
2212 switch (TYPE(ch)) {
2213 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002214 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002215 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002216 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002217 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002218 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2219 if (!exp)
2220 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002221 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222 }
2223 case return_stmt:
2224 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002225 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002227 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 if (!expression)
2229 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002230 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 }
2232 case raise_stmt:
2233 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002234 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2235 else if (NCH(ch) >= 2) {
2236 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2238 if (!expression)
2239 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002240 if (NCH(ch) == 4) {
2241 cause = ast_for_expr(c, CHILD(ch, 3));
2242 if (!cause)
2243 return NULL;
2244 }
2245 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002246 }
2247 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002248 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 "unexpected flow_stmt: %d", TYPE(ch));
2250 return NULL;
2251 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002252
2253 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002255}
2256
2257static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002258alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259{
2260 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002261 import_as_name: NAME ['as' NAME]
2262 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 dotted_name: NAME ('.' NAME)*
2264 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002265 PyObject *str;
2266
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 loop:
2268 switch (TYPE(n)) {
2269 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002270 str = NULL;
2271 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002272 str = NEW_IDENTIFIER(CHILD(n, 2));
2273 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002274 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 case dotted_as_name:
2276 if (NCH(n) == 1) {
2277 n = CHILD(n, 0);
2278 goto loop;
2279 }
2280 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002281 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002282 if (!a)
2283 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 assert(!a->asname);
2285 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2286 return a;
2287 }
2288 break;
2289 case dotted_name:
2290 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002292 else {
2293 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002294 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002295 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002297 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298
2299 len = 0;
2300 for (i = 0; i < NCH(n); i += 2)
2301 /* length of string plus one for the dot */
2302 len += strlen(STR(CHILD(n, i))) + 1;
2303 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002304 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 if (!str)
2306 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002307 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 if (!s)
2309 return NULL;
2310 for (i = 0; i < NCH(n); i += 2) {
2311 char *sch = STR(CHILD(n, i));
2312 strcpy(s, STR(CHILD(n, i)));
2313 s += strlen(sch);
2314 *s++ = '.';
2315 }
2316 --s;
2317 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002318 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2319 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002320 NULL);
2321 Py_DECREF(str);
2322 if (!uni)
2323 return NULL;
2324 str = uni;
2325 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002326 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002327 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328 }
2329 break;
2330 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002331 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002332 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002333 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002335 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002336 "unexpected import name: %d", TYPE(n));
2337 return NULL;
2338 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002339
2340 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 return NULL;
2342}
2343
2344static stmt_ty
2345ast_for_import_stmt(struct compiling *c, const node *n)
2346{
2347 /*
2348 import_stmt: import_name | import_from
2349 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002350 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2351 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002353 int lineno;
2354 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 int i;
2356 asdl_seq *aliases;
2357
2358 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002359 lineno = LINENO(n);
2360 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002361 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002362 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002364 REQ(n, dotted_as_names);
2365 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2366 if (!aliases)
2367 return NULL;
2368 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002369 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002370 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002372 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002374 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002376 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 int idx, ndots = 0;
2379 alias_ty mod = NULL;
2380 identifier modname;
2381
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002382 /* Count the number of dots (for relative imports) and check for the
2383 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 for (idx = 1; idx < NCH(n); idx++) {
2385 if (TYPE(CHILD(n, idx)) == dotted_name) {
2386 mod = alias_for_import_name(c, CHILD(n, idx));
2387 idx++;
2388 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002389 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2390 /* three consecutive dots are tokenized as one ELLIPSIS */
2391 ndots += 3;
2392 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002393 } else if (TYPE(CHILD(n, idx)) != DOT) {
2394 break;
2395 }
2396 ndots++;
2397 }
2398 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002399 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002400 case STAR:
2401 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002402 n = CHILD(n, idx);
2403 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002404 break;
2405 case LPAR:
2406 /* from ... import (x, y, z) */
2407 n = CHILD(n, idx + 1);
2408 n_children = NCH(n);
2409 break;
2410 case import_as_names:
2411 /* from ... import x, y, z */
2412 n = CHILD(n, idx);
2413 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002414 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415 ast_error(n, "trailing comma not allowed without"
2416 " surrounding parentheses");
2417 return NULL;
2418 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002419 break;
2420 default:
2421 ast_error(n, "Unexpected node-type in from-import");
2422 return NULL;
2423 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424
Thomas Wouters89f507f2006-12-13 04:49:30 +00002425 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2426 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428
2429 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002430 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002431 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002432 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002434 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002436 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002438 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2439 if (!import_alias)
2440 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002441 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002442 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002444 if (mod != NULL)
2445 modname = mod->name;
2446 else
2447 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002448 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002449 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 }
Neal Norwitz79792652005-11-14 04:25:03 +00002451 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 "unknown import statement: starts with command '%s'",
2453 STR(CHILD(n, 0)));
2454 return NULL;
2455}
2456
2457static stmt_ty
2458ast_for_global_stmt(struct compiling *c, const node *n)
2459{
2460 /* global_stmt: 'global' NAME (',' NAME)* */
2461 identifier name;
2462 asdl_seq *s;
2463 int i;
2464
2465 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002466 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002467 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002468 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002470 name = NEW_IDENTIFIER(CHILD(n, i));
2471 if (!name)
2472 return NULL;
2473 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002475 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002476}
2477
2478static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002479ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2480{
2481 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2482 identifier name;
2483 asdl_seq *s;
2484 int i;
2485
2486 REQ(n, nonlocal_stmt);
2487 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2488 if (!s)
2489 return NULL;
2490 for (i = 1; i < NCH(n); i += 2) {
2491 name = NEW_IDENTIFIER(CHILD(n, i));
2492 if (!name)
2493 return NULL;
2494 asdl_seq_SET(s, i / 2, name);
2495 }
2496 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2497}
2498
2499static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500ast_for_assert_stmt(struct compiling *c, const node *n)
2501{
2502 /* assert_stmt: 'assert' test [',' test] */
2503 REQ(n, assert_stmt);
2504 if (NCH(n) == 2) {
2505 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2506 if (!expression)
2507 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002508 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002509 }
2510 else if (NCH(n) == 4) {
2511 expr_ty expr1, expr2;
2512
2513 expr1 = ast_for_expr(c, CHILD(n, 1));
2514 if (!expr1)
2515 return NULL;
2516 expr2 = ast_for_expr(c, CHILD(n, 3));
2517 if (!expr2)
2518 return NULL;
2519
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 }
Neal Norwitz79792652005-11-14 04:25:03 +00002522 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523 "improper number of parts to 'assert' statement: %d",
2524 NCH(n));
2525 return NULL;
2526}
2527
2528static asdl_seq *
2529ast_for_suite(struct compiling *c, const node *n)
2530{
2531 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002532 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 stmt_ty s;
2534 int i, total, num, end, pos = 0;
2535 node *ch;
2536
2537 REQ(n, suite);
2538
2539 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002540 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002542 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002544 n = CHILD(n, 0);
2545 /* simple_stmt always ends with a NEWLINE,
2546 and may have a trailing SEMI
2547 */
2548 end = NCH(n) - 1;
2549 if (TYPE(CHILD(n, end - 1)) == SEMI)
2550 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002552 for (i = 0; i < end; i += 2) {
2553 ch = CHILD(n, i);
2554 s = ast_for_stmt(c, ch);
2555 if (!s)
2556 return NULL;
2557 asdl_seq_SET(seq, pos++, s);
2558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 }
2560 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002561 for (i = 2; i < (NCH(n) - 1); i++) {
2562 ch = CHILD(n, i);
2563 REQ(ch, stmt);
2564 num = num_stmts(ch);
2565 if (num == 1) {
2566 /* small_stmt or compound_stmt with only one child */
2567 s = ast_for_stmt(c, ch);
2568 if (!s)
2569 return NULL;
2570 asdl_seq_SET(seq, pos++, s);
2571 }
2572 else {
2573 int j;
2574 ch = CHILD(ch, 0);
2575 REQ(ch, simple_stmt);
2576 for (j = 0; j < NCH(ch); j += 2) {
2577 /* statement terminates with a semi-colon ';' */
2578 if (NCH(CHILD(ch, j)) == 0) {
2579 assert((j + 1) == NCH(ch));
2580 break;
2581 }
2582 s = ast_for_stmt(c, CHILD(ch, j));
2583 if (!s)
2584 return NULL;
2585 asdl_seq_SET(seq, pos++, s);
2586 }
2587 }
2588 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 }
2590 assert(pos == seq->size);
2591 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592}
2593
2594static stmt_ty
2595ast_for_if_stmt(struct compiling *c, const node *n)
2596{
2597 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2598 ['else' ':' suite]
2599 */
2600 char *s;
2601
2602 REQ(n, if_stmt);
2603
2604 if (NCH(n) == 4) {
2605 expr_ty expression;
2606 asdl_seq *suite_seq;
2607
2608 expression = ast_for_expr(c, CHILD(n, 1));
2609 if (!expression)
2610 return NULL;
2611 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002612 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 return NULL;
2614
Guido van Rossumd8faa362007-04-27 19:54:29 +00002615 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2616 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002618
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619 s = STR(CHILD(n, 4));
2620 /* s[2], the third character in the string, will be
2621 's' for el_s_e, or
2622 'i' for el_i_f
2623 */
2624 if (s[2] == 's') {
2625 expr_ty expression;
2626 asdl_seq *seq1, *seq2;
2627
2628 expression = ast_for_expr(c, CHILD(n, 1));
2629 if (!expression)
2630 return NULL;
2631 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002632 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 return NULL;
2634 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002635 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 return NULL;
2637
Guido van Rossumd8faa362007-04-27 19:54:29 +00002638 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2639 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 }
2641 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002642 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002643 expr_ty expression;
2644 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 asdl_seq *orelse = NULL;
2646 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647 /* must reference the child n_elif+1 since 'else' token is third,
2648 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002649 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2650 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2651 has_else = 1;
2652 n_elif -= 3;
2653 }
2654 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655
Thomas Wouters89f507f2006-12-13 04:49:30 +00002656 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002657 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658
Thomas Wouters89f507f2006-12-13 04:49:30 +00002659 orelse = asdl_seq_new(1, c->c_arena);
2660 if (!orelse)
2661 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002662 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002665 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2666 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002668 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2669 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671
Guido van Rossumd8faa362007-04-27 19:54:29 +00002672 asdl_seq_SET(orelse, 0,
2673 If(expression, suite_seq, suite_seq2,
2674 LINENO(CHILD(n, NCH(n) - 6)),
2675 CHILD(n, NCH(n) - 6)->n_col_offset,
2676 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002677 /* the just-created orelse handled the last elif */
2678 n_elif--;
2679 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680
Thomas Wouters89f507f2006-12-13 04:49:30 +00002681 for (i = 0; i < n_elif; i++) {
2682 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002683 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2684 if (!newobj)
2685 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002687 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002688 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002690 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002691 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693 asdl_seq_SET(newobj, 0,
2694 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002695 LINENO(CHILD(n, off)),
2696 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002697 orelse = newobj;
2698 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002699 expression = ast_for_expr(c, CHILD(n, 1));
2700 if (!expression)
2701 return NULL;
2702 suite_seq = ast_for_suite(c, CHILD(n, 3));
2703 if (!suite_seq)
2704 return NULL;
2705 return If(expression, suite_seq, orelse,
2706 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002708
2709 PyErr_Format(PyExc_SystemError,
2710 "unexpected token in 'if' statement: %s", s);
2711 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712}
2713
2714static stmt_ty
2715ast_for_while_stmt(struct compiling *c, const node *n)
2716{
2717 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2718 REQ(n, while_stmt);
2719
2720 if (NCH(n) == 4) {
2721 expr_ty expression;
2722 asdl_seq *suite_seq;
2723
2724 expression = ast_for_expr(c, CHILD(n, 1));
2725 if (!expression)
2726 return NULL;
2727 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002728 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002730 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731 }
2732 else if (NCH(n) == 7) {
2733 expr_ty expression;
2734 asdl_seq *seq1, *seq2;
2735
2736 expression = ast_for_expr(c, CHILD(n, 1));
2737 if (!expression)
2738 return NULL;
2739 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002740 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 return NULL;
2742 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002743 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 return NULL;
2745
Thomas Wouters89f507f2006-12-13 04:49:30 +00002746 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002748
2749 PyErr_Format(PyExc_SystemError,
2750 "wrong number of tokens for 'while' statement: %d",
2751 NCH(n));
2752 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753}
2754
2755static stmt_ty
2756ast_for_for_stmt(struct compiling *c, const node *n)
2757{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002758 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 expr_ty expression;
2760 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002761 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2763 REQ(n, for_stmt);
2764
2765 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002766 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 if (!seq)
2768 return NULL;
2769 }
2770
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002771 node_target = CHILD(n, 1);
2772 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002773 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002775 /* Check the # of children rather than the length of _target, since
2776 for x, in ... has 1 element in _target, but still requires a Tuple. */
2777 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002778 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002780 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002781
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002782 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002783 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784 return NULL;
2785 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 return NULL;
2788
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002789 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2790 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791}
2792
2793static excepthandler_ty
2794ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2795{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002796 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 REQ(exc, except_clause);
2798 REQ(body, suite);
2799
2800 if (NCH(exc) == 1) {
2801 asdl_seq *suite_seq = ast_for_suite(c, body);
2802 if (!suite_seq)
2803 return NULL;
2804
Neal Norwitzad74aa82008-03-31 05:14:30 +00002805 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002806 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807 }
2808 else if (NCH(exc) == 2) {
2809 expr_ty expression;
2810 asdl_seq *suite_seq;
2811
2812 expression = ast_for_expr(c, CHILD(exc, 1));
2813 if (!expression)
2814 return NULL;
2815 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002816 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 return NULL;
2818
Neal Norwitzad74aa82008-03-31 05:14:30 +00002819 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002820 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002821 }
2822 else if (NCH(exc) == 4) {
2823 asdl_seq *suite_seq;
2824 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002825 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002826 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002828 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002829 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
2831 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002832 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 return NULL;
2834
Neal Norwitzad74aa82008-03-31 05:14:30 +00002835 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002836 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002837 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002838
2839 PyErr_Format(PyExc_SystemError,
2840 "wrong number of children for 'except' clause: %d",
2841 NCH(exc));
2842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843}
2844
2845static stmt_ty
2846ast_for_try_stmt(struct compiling *c, const node *n)
2847{
Neal Norwitzf599f422005-12-17 21:33:47 +00002848 const int nch = NCH(n);
2849 int n_except = (nch - 3)/3;
2850 asdl_seq *body, *orelse = NULL, *finally = NULL;
2851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002852 REQ(n, try_stmt);
2853
Neal Norwitzf599f422005-12-17 21:33:47 +00002854 body = ast_for_suite(c, CHILD(n, 2));
2855 if (body == NULL)
2856 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857
Neal Norwitzf599f422005-12-17 21:33:47 +00002858 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2859 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2860 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2861 /* we can assume it's an "else",
2862 because nch >= 9 for try-else-finally and
2863 it would otherwise have a type of except_clause */
2864 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2865 if (orelse == NULL)
2866 return NULL;
2867 n_except--;
2868 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Neal Norwitzf599f422005-12-17 21:33:47 +00002870 finally = ast_for_suite(c, CHILD(n, nch - 1));
2871 if (finally == NULL)
2872 return NULL;
2873 n_except--;
2874 }
2875 else {
2876 /* we can assume it's an "else",
2877 otherwise it would have a type of except_clause */
2878 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2879 if (orelse == NULL)
2880 return NULL;
2881 n_except--;
2882 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002884 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002885 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886 return NULL;
2887 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002888
2889 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002890 int i;
2891 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002892 /* process except statements to create a try ... except */
2893 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2894 if (handlers == NULL)
2895 return NULL;
2896
2897 for (i = 0; i < n_except; i++) {
2898 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2899 CHILD(n, 5 + i * 3));
2900 if (!e)
2901 return NULL;
2902 asdl_seq_SET(handlers, i, e);
2903 }
2904
Thomas Wouters89f507f2006-12-13 04:49:30 +00002905 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002906 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002907 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002908 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002909
2910 /* if a 'finally' is present too, we nest the TryExcept within a
2911 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002912 body = asdl_seq_new(1, c->c_arena);
2913 if (body == NULL)
2914 return NULL;
2915 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002916 }
2917
2918 /* must be a try ... finally (except clauses are in body, if any exist) */
2919 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002920 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921}
2922
Guido van Rossumc2e20742006-02-27 22:32:47 +00002923static expr_ty
2924ast_for_with_var(struct compiling *c, const node *n)
2925{
2926 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002927 return ast_for_expr(c, CHILD(n, 1));
2928}
2929
2930/* with_stmt: 'with' test [ with_var ] ':' suite */
2931static stmt_ty
2932ast_for_with_stmt(struct compiling *c, const node *n)
2933{
2934 expr_ty context_expr, optional_vars = NULL;
2935 int suite_index = 3; /* skip 'with', test, and ':' */
2936 asdl_seq *suite_seq;
2937
2938 assert(TYPE(n) == with_stmt);
2939 context_expr = ast_for_expr(c, CHILD(n, 1));
2940 if (TYPE(CHILD(n, 2)) == with_var) {
2941 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2942
2943 if (!optional_vars) {
2944 return NULL;
2945 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002946 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002947 return NULL;
2948 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002949 suite_index = 4;
2950 }
2951
2952 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2953 if (!suite_seq) {
2954 return NULL;
2955 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002956 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002957 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002958}
2959
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002961ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002963 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2964 asdl_seq *s;
2965 expr_ty call, dummy;
2966
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 REQ(n, classdef);
2968
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002969 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 s = ast_for_suite(c, CHILD(n, 3));
2971 if (!s)
2972 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002973 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002974 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002976
2977 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002978 s = ast_for_suite(c, CHILD(n,5));
2979 if (!s)
2980 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002981 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002982 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 }
2984
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002985 /* class NAME '(' arglist ')' ':' suite */
2986 /* build up a fake Call node so we can extract its pieces */
2987 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2988 call = ast_for_call(c, CHILD(n, 3), dummy);
2989 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002992 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002993 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002994
2995 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2996 call->v.Call.args, call->v.Call.keywords,
2997 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002998 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999}
3000
3001static stmt_ty
3002ast_for_stmt(struct compiling *c, const node *n)
3003{
3004 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003005 assert(NCH(n) == 1);
3006 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 }
3008 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003009 assert(num_stmts(n) == 1);
3010 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 }
3012 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003013 REQ(n, small_stmt);
3014 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003015 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3016 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003017 */
3018 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 case expr_stmt:
3020 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021 case del_stmt:
3022 return ast_for_del_stmt(c, n);
3023 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003024 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 case flow_stmt:
3026 return ast_for_flow_stmt(c, n);
3027 case import_stmt:
3028 return ast_for_import_stmt(c, n);
3029 case global_stmt:
3030 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003031 case nonlocal_stmt:
3032 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 case assert_stmt:
3034 return ast_for_assert_stmt(c, n);
3035 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003036 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3038 TYPE(n), NCH(n));
3039 return NULL;
3040 }
3041 }
3042 else {
3043 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003044 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003045 */
3046 node *ch = CHILD(n, 0);
3047 REQ(n, compound_stmt);
3048 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 case if_stmt:
3050 return ast_for_if_stmt(c, ch);
3051 case while_stmt:
3052 return ast_for_while_stmt(c, ch);
3053 case for_stmt:
3054 return ast_for_for_stmt(c, ch);
3055 case try_stmt:
3056 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003057 case with_stmt:
3058 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003060 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003062 return ast_for_classdef(c, ch, NULL);
3063 case decorated:
3064 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003066 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3068 TYPE(n), NCH(n));
3069 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 }
3072}
3073
3074static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003075parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003077 const char *end;
3078 long x;
3079 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003081 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003082 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083#endif
3084
Guido van Rossumd8faa362007-04-27 19:54:29 +00003085 errno = 0;
3086 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003087#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003088 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003090 if (s[0] == '0') {
3091 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3092 if (x < 0 && errno == 0) {
3093 return PyLong_FromString((char *)s,
3094 (char **)0,
3095 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003096 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003097 }
3098 else
3099 x = PyOS_strtol((char *)s, (char **)&end, 0);
3100 if (*end == '\0') {
3101 if (errno != 0)
3102 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003103 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003104 }
3105 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003107 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003108 compl.real = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003109 PyFPE_START_PROTECT("atof", return 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003110 compl.imag = PyOS_ascii_atof(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003111 PyFPE_END_PROTECT(c)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003112 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003113 }
3114 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 {
3117 PyFPE_START_PROTECT("atof", return 0)
3118 dx = PyOS_ascii_atof(s);
3119 PyFPE_END_PROTECT(dx)
3120 return PyFloat_FromDouble(dx);
3121 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122}
3123
3124static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003125decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003127 PyObject *u, *v;
3128 char *s, *t;
3129 t = s = (char *)*sPtr;
3130 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3131 while (s < end && (*s & 0x80)) s++;
3132 *sPtr = s;
3133 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3134 if (u == NULL)
3135 return NULL;
3136 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3137 Py_DECREF(u);
3138 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139}
3140
3141static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003142decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003144 PyObject *v, *u;
3145 char *buf;
3146 char *p;
3147 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003148
Guido van Rossumd8faa362007-04-27 19:54:29 +00003149 if (encoding == NULL) {
3150 buf = (char *)s;
3151 u = NULL;
3152 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3153 buf = (char *)s;
3154 u = NULL;
3155 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003156 /* check for integer overflow */
3157 if (len > PY_SIZE_MAX / 4)
3158 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003159 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003160 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 if (u == NULL)
3162 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003163 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 end = s + len;
3165 while (s < end) {
3166 if (*s == '\\') {
3167 *p++ = *s++;
3168 if (*s & 0x80) {
3169 strcpy(p, "u005c");
3170 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003171 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003172 }
3173 if (*s & 0x80) { /* XXX inefficient */
3174 PyObject *w;
3175 char *r;
3176 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003177 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003178 if (w == NULL) {
3179 Py_DECREF(u);
3180 return NULL;
3181 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003182 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003183 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003184 assert(rn % 2 == 0);
3185 for (i = 0; i < rn; i += 2) {
3186 sprintf(p, "\\u%02x%02x",
3187 r[i + 0] & 0xFF,
3188 r[i + 1] & 0xFF);
3189 p += 6;
3190 }
3191 Py_DECREF(w);
3192 } else {
3193 *p++ = *s++;
3194 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003195 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003196 len = p - buf;
3197 s = buf;
3198 }
3199 if (rawmode)
3200 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3201 else
3202 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3203 Py_XDECREF(u);
3204 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205}
3206
3207/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003208 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209 * parsestr parses it, and returns the decoded Python string object.
3210 */
3211static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003212parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003214 size_t len;
3215 const char *s = STR(n);
3216 int quote = Py_CHARMASK(*s);
3217 int rawmode = 0;
3218 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003219 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 if (quote == 'b' || quote == 'B') {
3221 quote = *++s;
3222 *bytesmode = 1;
3223 }
3224 if (quote == 'r' || quote == 'R') {
3225 quote = *++s;
3226 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003227 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228 }
3229 if (quote != '\'' && quote != '\"') {
3230 PyErr_BadInternalCall();
3231 return NULL;
3232 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003233 s++;
3234 len = strlen(s);
3235 if (len > INT_MAX) {
3236 PyErr_SetString(PyExc_OverflowError,
3237 "string to parse is too long");
3238 return NULL;
3239 }
3240 if (s[--len] != quote) {
3241 PyErr_BadInternalCall();
3242 return NULL;
3243 }
3244 if (len >= 4 && s[0] == quote && s[1] == quote) {
3245 s += 2;
3246 len -= 2;
3247 if (s[--len] != quote || s[--len] != quote) {
3248 PyErr_BadInternalCall();
3249 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003250 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003251 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003252 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003253 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003254 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003255 if (*bytesmode) {
3256 /* Disallow non-ascii characters (but not escapes) */
3257 const char *c;
3258 for (c = s; *c; c++) {
3259 if (Py_CHARMASK(*c) >= 0x80) {
3260 ast_error(n, "bytes can only contain ASCII "
3261 "literal characters.");
3262 return NULL;
3263 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003264 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003266 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
3267 strcmp(c->c_encoding, "utf-8") != 0 &&
3268 strcmp(c->c_encoding, "iso-8859-1") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003269 if (rawmode || strchr(s, '\\') == NULL) {
3270 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003272 if (u == NULL || !*bytesmode)
3273 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003274 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 Py_DECREF(u);
3276 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003277 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003278 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003279 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003280 return PyUnicode_FromStringAndSize(s, len);
3281 } else {
3282 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003283 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003284 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003285 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003286 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287}
3288
Guido van Rossum29fd7122007-11-12 01:13:56 +00003289/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003290 * compile-time literal catenation, calling parsestr() on each piece, and
3291 * pasting the intermediate results together.
3292 */
3293static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003294parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003296 PyObject *v;
3297 int i;
3298 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003299 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003300 if (v != NULL) {
3301 /* String literal concatenation */
3302 for (i = 1; i < NCH(n); i++) {
3303 PyObject *s;
3304 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003305 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003306 if (s == NULL)
3307 goto onError;
3308 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003309 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003310 goto onError;
3311 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003312 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3313 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 if (v == NULL)
3315 goto onError;
3316 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 else {
3318 PyObject *temp = PyUnicode_Concat(v, s);
3319 Py_DECREF(s);
3320 Py_DECREF(v);
3321 v = temp;
3322 if (v == NULL)
3323 goto onError;
3324 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003325 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 }
3327 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328
Guido van Rossumd8faa362007-04-27 19:54:29 +00003329 onError:
3330 Py_XDECREF(v);
3331 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003332}