blob: df948501b3430c18fe5438a832da3e1087464b96 [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",
Benjamin Petersonbde16762008-11-08 19:56:21 +0000357 "__debug__",
Guido van Rossume7ba4952007-06-06 23:52:48 +0000358 NULL,
359};
360
361static int
362forbidden_name(expr_ty e, const node *n)
363{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000364 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000365 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000366 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000367 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000368 ast_error(n, "assignment to keyword");
369 return 1;
370 }
371 }
372 return 0;
373}
374
Jeremy Hyltona8293132006-02-28 17:58:27 +0000375/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000376
377 Only sets context for expr kinds that "can appear in assignment context"
378 (according to ../Parser/Python.asdl). For other expr kinds, it sets
379 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000380*/
381
382static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000383set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000384{
385 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000386 /* If a particular expression type can't be used for assign / delete,
387 set expr_name to its name and an error message will be generated.
388 */
389 const char* expr_name = NULL;
390
391 /* The ast defines augmented store and load contexts, but the
392 implementation here doesn't actually use them. The code may be
393 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000395 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000396 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000397 */
398 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000399
400 switch (e->kind) {
401 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000402 e->v.Attribute.ctx = ctx;
403 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000404 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 e->v.Subscript.ctx = ctx;
406 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000407 case Starred_kind:
408 e->v.Starred.ctx = ctx;
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000409 if (!set_context(c, e->v.Starred.value, ctx, n))
Guido van Rossum0368b722007-05-11 16:50:42 +0000410 return 0;
411 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000413 if (ctx == Store) {
414 if (forbidden_name(e, n))
415 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000416 }
417 e->v.Name.ctx = ctx;
418 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000419 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420 e->v.List.ctx = ctx;
421 s = e->v.List.elts;
422 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423 case Tuple_kind:
424 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
425 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 e->v.Tuple.ctx = ctx;
427 s = e->v.Tuple.elts;
428 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000429 case Lambda_kind:
430 expr_name = "lambda";
431 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000433 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000434 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000435 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000437 case UnaryOp_kind:
438 expr_name = "operator";
439 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000440 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000441 expr_name = "generator expression";
442 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000443 case Yield_kind:
444 expr_name = "yield expression";
445 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000446 case ListComp_kind:
447 expr_name = "list comprehension";
448 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000449 case SetComp_kind:
450 expr_name = "set comprehension";
451 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000452 case DictComp_kind:
453 expr_name = "dict comprehension";
454 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000455 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000456 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000457 case Num_kind:
458 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000459 expr_name = "literal";
460 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000461 case Ellipsis_kind:
462 expr_name = "Ellipsis";
463 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000464 case Compare_kind:
465 expr_name = "comparison";
466 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000467 case IfExp_kind:
468 expr_name = "conditional expression";
469 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000470 default:
471 PyErr_Format(PyExc_SystemError,
472 "unexpected expression in assignment %d (line %d)",
473 e->kind, e->lineno);
474 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000476 /* Check for error string set by switch */
477 if (expr_name) {
478 char buf[300];
479 PyOS_snprintf(buf, sizeof(buf),
480 "can't %s %s",
481 ctx == Store ? "assign to" : "delete",
482 expr_name);
483 return ast_error(n, buf);
484 }
485
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000486 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000487 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488 */
489 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000490 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000491
Thomas Wouters89f507f2006-12-13 04:49:30 +0000492 for (i = 0; i < asdl_seq_LEN(s); i++) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000493 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000494 return 0;
495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000496 }
497 return 1;
498}
499
500static operator_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000501ast_for_augassign(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502{
503 REQ(n, augassign);
504 n = CHILD(n, 0);
505 switch (STR(n)[0]) {
506 case '+':
507 return Add;
508 case '-':
509 return Sub;
510 case '/':
511 if (STR(n)[1] == '/')
512 return FloorDiv;
513 else
514 return Div;
515 case '%':
516 return Mod;
517 case '<':
518 return LShift;
519 case '>':
520 return RShift;
521 case '&':
522 return BitAnd;
523 case '^':
524 return BitXor;
525 case '|':
526 return BitOr;
527 case '*':
528 if (STR(n)[1] == '*')
529 return Pow;
530 else
531 return Mult;
532 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000533 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535 }
536}
537
538static cmpop_ty
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000539ast_for_comp_op(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000540{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000541 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542 |'is' 'not'
543 */
544 REQ(n, comp_op);
545 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 n = CHILD(n, 0);
547 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548 case LESS:
549 return Lt;
550 case GREATER:
551 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000552 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553 return Eq;
554 case LESSEQUAL:
555 return LtE;
556 case GREATEREQUAL:
557 return GtE;
558 case NOTEQUAL:
559 return NotEq;
560 case NAME:
561 if (strcmp(STR(n), "in") == 0)
562 return In;
563 if (strcmp(STR(n), "is") == 0)
564 return Is;
565 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000566 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000568 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000569 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 }
571 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 /* handle "not in" and "is not" */
573 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000574 case NAME:
575 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
576 return NotIn;
577 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
578 return IsNot;
579 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000580 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 }
Neal Norwitz79792652005-11-14 04:25:03 +0000585 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000586 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000587 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588}
589
590static asdl_seq *
591seq_for_testlist(struct compiling *c, const node *n)
592{
593 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000594 asdl_seq *seq;
595 expr_ty expression;
596 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000597 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000599 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000600 if (!seq)
601 return NULL;
602
603 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000604 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605
606 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000607 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609
610 assert(i / 2 < seq->size);
611 asdl_seq_SET(seq, i / 2, expression);
612 }
613 return seq;
614}
615
Neal Norwitzc1505362006-12-28 06:47:50 +0000616static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000617compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000618{
619 identifier name;
620 expr_ty annotation = NULL;
621 node *ch;
622
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000623 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000625 name = NEW_IDENTIFIER(ch);
626 if (!name)
627 return NULL;
628
629 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
630 annotation = ast_for_expr(c, CHILD(n, 2));
631 if (!annotation)
632 return NULL;
633 }
634
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000635 return arg(name, annotation, c->c_arena);
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000636#if 0
637 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
638 if (!set_context(c, result, Store, n))
639 return NULL;
640 return result;
641#endif
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642}
643
Guido van Rossum4f72a782006-10-27 23:31:49 +0000644/* returns -1 if failed to handle keyword only arguments
645 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000646 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000647 ^^^
648 start pointing here
649 */
650static int
651handle_keywordonly_args(struct compiling *c, const node *n, int start,
652 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
653{
654 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000655 expr_ty expression, annotation;
656 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000657 int i = start;
658 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000659
660 if (kwonlyargs == NULL) {
661 ast_error(CHILD(n, start), "named arguments must follow bare *");
662 return -1;
663 }
664 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000665 while (i < NCH(n)) {
666 ch = CHILD(n, i);
667 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000668 case vfpdef:
669 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000670 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000672 asdl_seq_SET(kwdefaults, j, expression);
673 i += 2; /* '=' and test */
674 }
675 else { /* setting NULL if no default value exists */
676 asdl_seq_SET(kwdefaults, j, NULL);
677 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000678 if (NCH(ch) == 3) {
679 /* ch is NAME ':' test */
680 annotation = ast_for_expr(c, CHILD(ch, 2));
681 if (!annotation) {
682 ast_error(ch, "expected expression");
683 goto error;
684 }
685 }
686 else {
687 annotation = NULL;
688 }
689 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000690 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000691 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000692 ast_error(ch, "expecting name");
693 goto error;
694 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000695 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000696 i += 2; /* the name and the comma */
697 break;
698 case DOUBLESTAR:
699 return i;
700 default:
701 ast_error(ch, "unexpected node");
702 goto error;
703 }
704 }
705 return i;
706 error:
707 return -1;
708}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709
Jeremy Hyltona8293132006-02-28 17:58:27 +0000710/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711
712static arguments_ty
713ast_for_arguments(struct compiling *c, const node *n)
714{
Neal Norwitzc1505362006-12-28 06:47:50 +0000715 /* This function handles both typedargslist (function definition)
716 and varargslist (lambda definition).
717
718 parameters: '(' [typedargslist] ')'
719 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000720 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
721 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000722 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000723 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000724 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000725 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
726 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000728 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000730 int i, j, k, nposargs = 0, nkwonlyargs = 0;
731 int nposdefaults = 0, found_default = 0;
732 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000734 arg_ty arg;
735 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 node *ch;
737
738 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000740 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
741 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000742 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000744 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000745
Jeremy Hyltone921e022008-07-17 16:37:17 +0000746 /* First count the number of positional args & defaults. The
747 variable i is the loop index for this for loop and the next.
748 The next loop picks up where the first leaves off.
749 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000750 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000751 ch = CHILD(n, i);
752 if (TYPE(ch) == STAR) {
Jeremy Hyltone921e022008-07-17 16:37:17 +0000753 /* skip star */
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000754 i++;
Jeremy Hyltone921e022008-07-17 16:37:17 +0000755 if (i < NCH(n) && /* skip argument following star */
756 (TYPE(CHILD(n, i)) == tfpdef ||
757 TYPE(CHILD(n, i)) == vfpdef)) {
758 i++;
759 }
760 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000761 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000762 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000763 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000764 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000766 /* count the number of keyword only args &
767 defaults for keyword only args */
768 for ( ; i < NCH(n); ++i) {
769 ch = CHILD(n, i);
770 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000771 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000772 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000773 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
774 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000775 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000776 kwonlyargs = (nkwonlyargs ?
777 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
778 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000779 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000780 posdefaults = (nposdefaults ?
781 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
782 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000783 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000784 /* The length of kwonlyargs and kwdefaults are same
785 since we set NULL as default for keyword only argument w/o default
786 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000787 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000788 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
789 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000790 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791
792 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000793 ast_error(n, "more than 255 arguments");
794 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000795 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000797 /* tfpdef: NAME [':' test]
798 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799 */
800 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000801 j = 0; /* index for defaults */
802 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000804 ch = CHILD(n, i);
805 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000806 case tfpdef:
807 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
809 anything other than EQUAL or a comma? */
810 /* XXX Should NCH(n) check be made a separate check? */
811 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000812 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
813 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000814 goto error;
815 assert(posdefaults != NULL);
816 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000818 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000819 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 else if (found_default) {
821 ast_error(n,
822 "non-default argument follows default argument");
823 goto error;
824 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000825 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000826 if (!arg)
827 goto error;
828 asdl_seq_SET(posargs, k++, arg);
829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 i += 2; /* the name and the comma */
831 break;
832 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000833 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000834 ast_error(CHILD(n, i),
835 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000836 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000837 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000838 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000839 if (TYPE(ch) == COMMA) {
840 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000841 i += 2; /* now follows keyword only arguments */
842 res = handle_keywordonly_args(c, n, i,
843 kwonlyargs, kwdefaults);
844 if (res == -1) goto error;
845 i = res; /* res has new position to process */
846 }
847 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000848 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
849 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000850 /* there is an annotation on the vararg */
851 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000852 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000853 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000854 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
855 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000856 int res = 0;
857 res = handle_keywordonly_args(c, n, i,
858 kwonlyargs, kwdefaults);
859 if (res == -1) goto error;
860 i = res; /* res has new position to process */
861 }
862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 break;
864 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000865 ch = CHILD(n, i+1); /* tfpdef */
866 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000867 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
868 if (NCH(ch) > 1) {
869 /* there is an annotation on the kwarg */
870 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872 i += 3;
873 break;
874 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000875 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876 "unexpected node in varargslist: %d @ %d",
877 TYPE(ch), i);
878 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000879 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000881 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
882 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000884 Py_XDECREF(vararg);
885 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886 return NULL;
887}
888
889static expr_ty
890ast_for_dotted_name(struct compiling *c, const node *n)
891{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000892 expr_ty e;
893 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000894 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895 int i;
896
897 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000898
899 lineno = LINENO(n);
900 col_offset = n->n_col_offset;
901
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902 id = NEW_IDENTIFIER(CHILD(n, 0));
903 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000904 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000905 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000907 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908
909 for (i = 2; i < NCH(n); i+=2) {
910 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000911 if (!id)
912 return NULL;
913 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
914 if (!e)
915 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000916 }
917
918 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919}
920
921static expr_ty
922ast_for_decorator(struct compiling *c, const node *n)
923{
924 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
925 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000926 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927
928 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000929 REQ(CHILD(n, 0), AT);
930 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
932 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
933 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934 return NULL;
935
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000936 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000937 d = name_expr;
938 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 }
940 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000941 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000942 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000943 if (!d)
944 return NULL;
945 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946 }
947 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000948 d = ast_for_call(c, CHILD(n, 3), name_expr);
949 if (!d)
950 return NULL;
951 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000952 }
953
954 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955}
956
957static asdl_seq*
958ast_for_decorators(struct compiling *c, const node *n)
959{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000960 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000961 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000962 int i;
963
964 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000965 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 if (!decorator_seq)
967 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000968
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000969 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000970 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000971 if (!d)
972 return NULL;
973 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974 }
975 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976}
977
978static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000979ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000981 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000982 identifier name;
983 arguments_ty args;
984 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000985 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000986 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987
988 REQ(n, funcdef);
989
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990 name = NEW_IDENTIFIER(CHILD(n, name_i));
991 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000992 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 args = ast_for_arguments(c, CHILD(n, name_i + 1));
994 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000995 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000996 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
997 returns = ast_for_expr(c, CHILD(n, name_i + 3));
998 if (!returns)
999 return NULL;
1000 name_i += 2;
1001 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002 body = ast_for_suite(c, CHILD(n, name_i + 3));
1003 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005
Neal Norwitzc1505362006-12-28 06:47:50 +00001006 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001007 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008}
1009
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001010static stmt_ty
1011ast_for_decorated(struct compiling *c, const node *n)
1012{
1013 /* decorated: decorators (classdef | funcdef) */
1014 stmt_ty thing = NULL;
1015 asdl_seq *decorator_seq = NULL;
1016
1017 REQ(n, decorated);
1018
1019 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1020 if (!decorator_seq)
1021 return NULL;
1022
1023 assert(TYPE(CHILD(n, 1)) == funcdef ||
1024 TYPE(CHILD(n, 1)) == classdef);
1025
1026 if (TYPE(CHILD(n, 1)) == funcdef) {
1027 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1028 } else if (TYPE(CHILD(n, 1)) == classdef) {
1029 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1030 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001031 /* we count the decorators in when talking about the class' or
1032 * function's line number */
1033 if (thing) {
1034 thing->lineno = LINENO(n);
1035 thing->col_offset = n->n_col_offset;
1036 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001037 return thing;
1038}
1039
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040static expr_ty
1041ast_for_lambdef(struct compiling *c, const node *n)
1042{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001043 /* lambdef: 'lambda' [varargslist] ':' test
1044 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 arguments_ty args;
1046 expr_ty expression;
1047
1048 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001049 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1050 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 if (!args)
1052 return NULL;
1053 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001054 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056 }
1057 else {
1058 args = ast_for_arguments(c, CHILD(n, 1));
1059 if (!args)
1060 return NULL;
1061 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001062 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064 }
1065
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001066 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067}
1068
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001069static expr_ty
1070ast_for_ifexpr(struct compiling *c, const node *n)
1071{
1072 /* test: or_test 'if' or_test 'else' test */
1073 expr_ty expression, body, orelse;
1074
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001075 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001076 body = ast_for_expr(c, CHILD(n, 0));
1077 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001079 expression = ast_for_expr(c, CHILD(n, 2));
1080 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001081 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001082 orelse = ast_for_expr(c, CHILD(n, 4));
1083 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001084 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001085 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1086 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001087}
1088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001090 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091
Nick Coghlan650f0d02007-04-15 12:05:43 +00001092 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001093*/
1094
1095static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001096count_comp_fors(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001099
Guido van Rossumd8faa362007-04-27 19:54:29 +00001100 count_comp_for:
1101 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001102 REQ(n, comp_for);
1103 if (NCH(n) == 5)
1104 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001105 else
1106 return n_fors;
1107 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001108 REQ(n, comp_iter);
1109 n = CHILD(n, 0);
1110 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001111 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001112 else if (TYPE(n) == comp_if) {
1113 if (NCH(n) == 3) {
1114 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001115 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001116 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 else
1118 return n_fors;
1119 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001120
Guido van Rossumd8faa362007-04-27 19:54:29 +00001121 /* Should never be reached */
1122 PyErr_SetString(PyExc_SystemError,
1123 "logic error in count_comp_fors");
1124 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125}
1126
Nick Coghlan650f0d02007-04-15 12:05:43 +00001127/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001128
Nick Coghlan650f0d02007-04-15 12:05:43 +00001129 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130*/
1131
1132static int
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001133count_comp_ifs(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001134{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001135 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136
Guido van Rossumd8faa362007-04-27 19:54:29 +00001137 while (1) {
1138 REQ(n, comp_iter);
1139 if (TYPE(CHILD(n, 0)) == comp_for)
1140 return n_ifs;
1141 n = CHILD(n, 0);
1142 REQ(n, comp_if);
1143 n_ifs++;
1144 if (NCH(n) == 2)
1145 return n_ifs;
1146 n = CHILD(n, 2);
1147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148}
1149
Guido van Rossum992d4a32007-07-11 13:09:30 +00001150static asdl_seq *
1151ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001154 asdl_seq *comps;
1155
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001156 n_fors = count_comp_fors(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157 if (n_fors == -1)
1158 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001159
Nick Coghlan650f0d02007-04-15 12:05:43 +00001160 comps = asdl_seq_new(n_fors, c->c_arena);
1161 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001163
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001165 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166 asdl_seq *t;
1167 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001168 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169
Guido van Rossum992d4a32007-07-11 13:09:30 +00001170 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171
Guido van Rossum992d4a32007-07-11 13:09:30 +00001172 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001173 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001174 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001176 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001177 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179
Thomas Wouters89f507f2006-12-13 04:49:30 +00001180 /* Check the # of children rather than the length of t, since
1181 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1182 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001183 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1184 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001186 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001187 c->c_arena),
1188 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001189
Nick Coghlan650f0d02007-04-15 12:05:43 +00001190 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192
Guido van Rossum992d4a32007-07-11 13:09:30 +00001193 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 int j, n_ifs;
1195 asdl_seq *ifs;
1196
Guido van Rossum992d4a32007-07-11 13:09:30 +00001197 n = CHILD(n, 4);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001198 n_ifs = count_comp_ifs(c, n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001201
1202 ifs = asdl_seq_new(n_ifs, c->c_arena);
1203 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001205
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001207 REQ(n, comp_iter);
1208 n = CHILD(n, 0);
1209 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210
Guido van Rossum992d4a32007-07-11 13:09:30 +00001211 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001212 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001213 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001214 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001215 if (NCH(n) == 3)
1216 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001218 /* on exit, must guarantee that n is a comp_for */
1219 if (TYPE(n) == comp_iter)
1220 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001221 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001223 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001225 return comps;
1226}
1227
1228static expr_ty
1229ast_for_itercomp(struct compiling *c, const node *n, int type)
1230{
1231 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1232 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1233 expr_ty elt;
1234 asdl_seq *comps;
1235
1236 assert(NCH(n) > 1);
1237
1238 elt = ast_for_expr(c, CHILD(n, 0));
1239 if (!elt)
1240 return NULL;
1241
1242 comps = ast_for_comprehension(c, CHILD(n, 1));
1243 if (!comps)
1244 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001245
1246 if (type == COMP_GENEXP)
1247 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1248 else if (type == COMP_LISTCOMP)
1249 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1250 else if (type == COMP_SETCOMP)
1251 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1252 else
1253 /* Should never happen */
1254 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255}
1256
1257static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001258ast_for_dictcomp(struct compiling *c, const node *n)
1259{
1260 expr_ty key, value;
1261 asdl_seq *comps;
1262
1263 assert(NCH(n) > 3);
1264 REQ(CHILD(n, 1), COLON);
1265
1266 key = ast_for_expr(c, CHILD(n, 0));
1267 if (!key)
1268 return NULL;
1269
1270 value = ast_for_expr(c, CHILD(n, 2));
1271 if (!value)
1272 return NULL;
1273
1274 comps = ast_for_comprehension(c, CHILD(n, 3));
1275 if (!comps)
1276 return NULL;
1277
1278 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1279}
1280
1281static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001282ast_for_genexp(struct compiling *c, const node *n)
1283{
1284 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001285 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001286}
1287
1288static expr_ty
1289ast_for_listcomp(struct compiling *c, const node *n)
1290{
1291 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001292 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001293}
1294
1295static expr_ty
1296ast_for_setcomp(struct compiling *c, const node *n)
1297{
1298 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001299 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001300}
1301
1302
1303static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304ast_for_atom(struct compiling *c, const node *n)
1305{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001306 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1307 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001308 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 */
1310 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001311 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312
1313 switch (TYPE(ch)) {
1314 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001315 /* All names start in Load context, but may later be
1316 changed. */
1317 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001319 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001320 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001321 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001322 PyObject *type, *value, *tback, *errstr;
1323 PyErr_Fetch(&type, &value, &tback);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001324 errstr = PyObject_Str(value);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001325 if (errstr) {
1326 char *s = "";
1327 char buf[128];
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001328 s = _PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001329 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1330 ast_error(n, buf);
Benjamin Peterson6f7fad12008-11-21 22:58:57 +00001331 Py_DECREF(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001332 } else {
1333 ast_error(n, "(unicode error) unknown error");
1334 }
1335 Py_DECREF(type);
1336 Py_DECREF(value);
1337 Py_XDECREF(tback);
1338 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001339 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001340 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001342 if (bytesmode)
1343 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1344 else
1345 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001346 }
1347 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001348 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001349 if (!pynum)
1350 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001351
Thomas Wouters89f507f2006-12-13 04:49:30 +00001352 PyArena_AddPyObject(c->c_arena, pynum);
1353 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 }
Georg Brandldde00282007-03-18 19:01:53 +00001355 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001356 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 ch = CHILD(n, 1);
1359
1360 if (TYPE(ch) == RPAR)
1361 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1362
1363 if (TYPE(ch) == yield_expr)
1364 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001365
1366 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1367 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001368 return ast_for_genexp(c, ch);
1369
Nick Coghlan650f0d02007-04-15 12:05:43 +00001370 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001372 ch = CHILD(n, 1);
1373
1374 if (TYPE(ch) == RSQB)
1375 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1376
Nick Coghlan650f0d02007-04-15 12:05:43 +00001377 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001378 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1379 asdl_seq *elts = seq_for_testlist(c, ch);
1380 if (!elts)
1381 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001382
Thomas Wouters89f507f2006-12-13 04:49:30 +00001383 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1384 }
1385 else
1386 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001388 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1389 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001390 int i, size;
1391 asdl_seq *keys, *values;
1392
1393 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001394 if (TYPE(ch) == RBRACE) {
1395 /* it's an empty dict */
1396 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1397 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1398 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001399 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001400 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001401 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001402 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001403 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001404 for (i = 0; i < NCH(ch); i += 2) {
1405 expr_ty expression;
1406 expression = ast_for_expr(c, CHILD(ch, i));
1407 if (!expression)
1408 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001409 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001410 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001411 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1412 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1413 /* it's a set comprehension */
1414 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001415 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1416 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001417 } else {
1418 /* it's a dict */
1419 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1420 keys = asdl_seq_new(size, c->c_arena);
1421 if (!keys)
1422 return NULL;
1423
1424 values = asdl_seq_new(size, c->c_arena);
1425 if (!values)
1426 return NULL;
1427
1428 for (i = 0; i < NCH(ch); i += 4) {
1429 expr_ty expression;
1430
1431 expression = ast_for_expr(c, CHILD(ch, i));
1432 if (!expression)
1433 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001434
Guido van Rossum86e58e22006-08-28 15:27:34 +00001435 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001436
Guido van Rossum86e58e22006-08-28 15:27:34 +00001437 expression = ast_for_expr(c, CHILD(ch, i + 2));
1438 if (!expression)
1439 return NULL;
1440
1441 asdl_seq_SET(values, i / 4, expression);
1442 }
1443 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001447 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1448 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 }
1450}
1451
1452static slice_ty
1453ast_for_slice(struct compiling *c, const node *n)
1454{
1455 node *ch;
1456 expr_ty lower = NULL, upper = NULL, step = NULL;
1457
1458 REQ(n, subscript);
1459
1460 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001461 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 sliceop: ':' [test]
1463 */
1464 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 if (NCH(n) == 1 && TYPE(ch) == test) {
1466 /* 'step' variable hold no significance in terms of being used over
1467 other vars */
1468 step = ast_for_expr(c, ch);
1469 if (!step)
1470 return NULL;
1471
Thomas Wouters89f507f2006-12-13 04:49:30 +00001472 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 }
1474
1475 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001476 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001477 if (!lower)
1478 return NULL;
1479 }
1480
1481 /* If there's an upper bound it's in the second or third position. */
1482 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001483 if (NCH(n) > 1) {
1484 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485
Thomas Wouters89f507f2006-12-13 04:49:30 +00001486 if (TYPE(n2) == test) {
1487 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488 if (!upper)
1489 return NULL;
1490 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001491 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001492 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001493 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494
Thomas Wouters89f507f2006-12-13 04:49:30 +00001495 if (TYPE(n2) == test) {
1496 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497 if (!upper)
1498 return NULL;
1499 }
1500 }
1501
1502 ch = CHILD(n, NCH(n) - 1);
1503 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001504 if (NCH(ch) == 1) {
1505 /* No expression, so step is None */
1506 ch = CHILD(ch, 0);
1507 step = Name(new_identifier("None", c->c_arena), Load,
1508 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!step)
1510 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001511 } else {
1512 ch = CHILD(ch, 1);
1513 if (TYPE(ch) == test) {
1514 step = ast_for_expr(c, ch);
1515 if (!step)
1516 return NULL;
1517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 }
1519 }
1520
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001521 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522}
1523
1524static expr_ty
1525ast_for_binop(struct compiling *c, const node *n)
1526{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001527 /* Must account for a sequence of expressions.
1528 How should A op B op C by represented?
1529 BinOp(BinOp(A, op, B), op, C).
1530 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531
Guido van Rossumd8faa362007-04-27 19:54:29 +00001532 int i, nops;
1533 expr_ty expr1, expr2, result;
1534 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535
Guido van Rossumd8faa362007-04-27 19:54:29 +00001536 expr1 = ast_for_expr(c, CHILD(n, 0));
1537 if (!expr1)
1538 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539
Guido van Rossumd8faa362007-04-27 19:54:29 +00001540 expr2 = ast_for_expr(c, CHILD(n, 2));
1541 if (!expr2)
1542 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001543
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 newoperator = get_operator(CHILD(n, 1));
1545 if (!newoperator)
1546 return NULL;
1547
1548 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1549 c->c_arena);
1550 if (!result)
1551 return NULL;
1552
1553 nops = (NCH(n) - 1) / 2;
1554 for (i = 1; i < nops; i++) {
1555 expr_ty tmp_result, tmp;
1556 const node* next_oper = CHILD(n, i * 2 + 1);
1557
1558 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001559 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560 return NULL;
1561
Guido van Rossumd8faa362007-04-27 19:54:29 +00001562 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1563 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564 return NULL;
1565
Guido van Rossumd8faa362007-04-27 19:54:29 +00001566 tmp_result = BinOp(result, newoperator, tmp,
1567 LINENO(next_oper), next_oper->n_col_offset,
1568 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001569 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001570 return NULL;
1571 result = tmp_result;
1572 }
1573 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574}
1575
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001576static expr_ty
1577ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1578{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001579 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1580 subscriptlist: subscript (',' subscript)* [',']
1581 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1582 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001583 REQ(n, trailer);
1584 if (TYPE(CHILD(n, 0)) == LPAR) {
1585 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001586 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1587 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001588 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001589 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001590 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001591 else if (TYPE(CHILD(n, 0)) == DOT ) {
1592 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001593 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001594 }
1595 else {
1596 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 REQ(CHILD(n, 2), RSQB);
1598 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001599 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001600 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1601 if (!slc)
1602 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001603 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1604 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001605 }
1606 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001607 /* The grammar is ambiguous here. The ambiguity is resolved
1608 by treating the sequence as a tuple literal if there are
1609 no slice features.
1610 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 int j;
1612 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001613 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001614 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001615 asdl_seq *slices, *elts;
1616 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001617 if (!slices)
1618 return NULL;
1619 for (j = 0; j < NCH(n); j += 2) {
1620 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001621 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001622 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001623 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001624 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001625 asdl_seq_SET(slices, j / 2, slc);
1626 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 if (!simple) {
1628 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001629 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001630 }
1631 /* extract Index values and put them in a Tuple */
1632 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001633 if (!elts)
1634 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001635 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1636 slc = (slice_ty)asdl_seq_GET(slices, j);
1637 assert(slc->kind == Index_kind && slc->v.Index.value);
1638 asdl_seq_SET(elts, j, slc->v.Index.value);
1639 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001640 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001641 if (!e)
1642 return NULL;
1643 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001644 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001645 }
1646 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001647}
1648
1649static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001650ast_for_factor(struct compiling *c, const node *n)
1651{
1652 node *pfactor, *ppower, *patom, *pnum;
1653 expr_ty expression;
1654
1655 /* If the unary - operator is applied to a constant, don't generate
1656 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1657 constant. The peephole optimizer already does something like
1658 this but it doesn't handle the case where the constant is
1659 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1660 PyLongObject.
1661 */
1662 if (TYPE(CHILD(n, 0)) == MINUS
1663 && NCH(n) == 2
1664 && TYPE((pfactor = CHILD(n, 1))) == factor
1665 && NCH(pfactor) == 1
1666 && TYPE((ppower = CHILD(pfactor, 0))) == power
1667 && NCH(ppower) == 1
1668 && TYPE((patom = CHILD(ppower, 0))) == atom
1669 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1670 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1671 if (s == NULL)
1672 return NULL;
1673 s[0] = '-';
1674 strcpy(s + 1, STR(pnum));
1675 PyObject_FREE(STR(pnum));
1676 STR(pnum) = s;
1677 return ast_for_atom(c, patom);
1678 }
1679
1680 expression = ast_for_expr(c, CHILD(n, 1));
1681 if (!expression)
1682 return NULL;
1683
1684 switch (TYPE(CHILD(n, 0))) {
1685 case PLUS:
1686 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1687 c->c_arena);
1688 case MINUS:
1689 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1690 c->c_arena);
1691 case TILDE:
1692 return UnaryOp(Invert, expression, LINENO(n),
1693 n->n_col_offset, c->c_arena);
1694 }
1695 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1696 TYPE(CHILD(n, 0)));
1697 return NULL;
1698}
1699
1700static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001701ast_for_power(struct compiling *c, const node *n)
1702{
1703 /* power: atom trailer* ('**' factor)*
1704 */
1705 int i;
1706 expr_ty e, tmp;
1707 REQ(n, power);
1708 e = ast_for_atom(c, CHILD(n, 0));
1709 if (!e)
1710 return NULL;
1711 if (NCH(n) == 1)
1712 return e;
1713 for (i = 1; i < NCH(n); i++) {
1714 node *ch = CHILD(n, i);
1715 if (TYPE(ch) != trailer)
1716 break;
1717 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001718 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001719 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001720 tmp->lineno = e->lineno;
1721 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001722 e = tmp;
1723 }
1724 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1725 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001726 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001727 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001728 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001729 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001731 e = tmp;
1732 }
1733 return e;
1734}
1735
Guido van Rossum0368b722007-05-11 16:50:42 +00001736static expr_ty
1737ast_for_starred(struct compiling *c, const node *n)
1738{
1739 expr_ty tmp;
1740 REQ(n, star_expr);
1741
1742 tmp = ast_for_expr(c, CHILD(n, 1));
1743 if (!tmp)
1744 return NULL;
1745
1746 /* The Load context is changed later. */
1747 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1748}
1749
1750
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001751/* Do not name a variable 'expr'! Will cause a compile error.
1752*/
1753
1754static expr_ty
1755ast_for_expr(struct compiling *c, const node *n)
1756{
1757 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001758 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001759 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001760 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 and_test: not_test ('and' not_test)*
1762 not_test: 'not' not_test | comparison
1763 comparison: expr (comp_op expr)*
1764 expr: xor_expr ('|' xor_expr)*
1765 xor_expr: and_expr ('^' and_expr)*
1766 and_expr: shift_expr ('&' shift_expr)*
1767 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1768 arith_expr: term (('+'|'-') term)*
1769 term: factor (('*'|'/'|'%'|'//') factor)*
1770 factor: ('+'|'-'|'~') factor | power
1771 power: atom trailer* ('**' factor)*
1772 */
1773
1774 asdl_seq *seq;
1775 int i;
1776
1777 loop:
1778 switch (TYPE(n)) {
1779 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001780 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001781 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001782 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001784 else if (NCH(n) > 1)
1785 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001786 /* Fallthrough */
1787 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788 case and_test:
1789 if (NCH(n) == 1) {
1790 n = CHILD(n, 0);
1791 goto loop;
1792 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001793 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794 if (!seq)
1795 return NULL;
1796 for (i = 0; i < NCH(n); i += 2) {
1797 expr_ty e = ast_for_expr(c, CHILD(n, i));
1798 if (!e)
1799 return NULL;
1800 asdl_seq_SET(seq, i / 2, e);
1801 }
1802 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1804 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001805 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001806 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807 case not_test:
1808 if (NCH(n) == 1) {
1809 n = CHILD(n, 0);
1810 goto loop;
1811 }
1812 else {
1813 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1814 if (!expression)
1815 return NULL;
1816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001817 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1818 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 }
1820 case comparison:
1821 if (NCH(n) == 1) {
1822 n = CHILD(n, 0);
1823 goto loop;
1824 }
1825 else {
1826 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001827 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001830 if (!ops)
1831 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001832 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834 return NULL;
1835 }
1836 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001838
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001839 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843
1844 expression = ast_for_expr(c, CHILD(n, i + 1));
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 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850 asdl_seq_SET(cmps, i / 2, expression);
1851 }
1852 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001853 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001855 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001857 return Compare(expression, ops, cmps, LINENO(n),
1858 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859 }
1860 break;
1861
Guido van Rossum0368b722007-05-11 16:50:42 +00001862 case star_expr:
1863 if (TYPE(CHILD(n, 0)) == STAR) {
1864 return ast_for_starred(c, n);
1865 }
1866 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 /* The next five cases all handle BinOps. The main body of code
1868 is the same in each case, but the switch turned inside out to
1869 reuse the code for each type of operator.
1870 */
1871 case expr:
1872 case xor_expr:
1873 case and_expr:
1874 case shift_expr:
1875 case arith_expr:
1876 case term:
1877 if (NCH(n) == 1) {
1878 n = CHILD(n, 0);
1879 goto loop;
1880 }
1881 return ast_for_binop(c, n);
1882 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001883 expr_ty exp = NULL;
1884 if (NCH(n) == 2) {
1885 exp = ast_for_testlist(c, CHILD(n, 1));
1886 if (!exp)
1887 return NULL;
1888 }
1889 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1890 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001891 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892 if (NCH(n) == 1) {
1893 n = CHILD(n, 0);
1894 goto loop;
1895 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001896 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001897 case power:
1898 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001900 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901 return NULL;
1902 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001903 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904 return NULL;
1905}
1906
1907static expr_ty
1908ast_for_call(struct compiling *c, const node *n, expr_ty func)
1909{
1910 /*
1911 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1912 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001913 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914 */
1915
1916 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001917 asdl_seq *args;
1918 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 expr_ty vararg = NULL, kwarg = NULL;
1920
1921 REQ(n, arglist);
1922
1923 nargs = 0;
1924 nkeywords = 0;
1925 ngens = 0;
1926 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001927 node *ch = CHILD(n, i);
1928 if (TYPE(ch) == argument) {
1929 if (NCH(ch) == 1)
1930 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001931 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001932 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001934 nkeywords++;
1935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001936 }
1937 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001938 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001939 "if not sole argument");
1940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 }
1942
1943 if (nargs + nkeywords + ngens > 255) {
1944 ast_error(n, "more than 255 arguments");
1945 return NULL;
1946 }
1947
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001948 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001950 return NULL;
1951 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001953 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954 nargs = 0;
1955 nkeywords = 0;
1956 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001957 node *ch = CHILD(n, i);
1958 if (TYPE(ch) == argument) {
1959 expr_ty e;
1960 if (NCH(ch) == 1) {
1961 if (nkeywords) {
1962 ast_error(CHILD(ch, 0),
1963 "non-keyword arg after keyword arg");
1964 return NULL;
1965 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001966 if (vararg) {
1967 ast_error(CHILD(ch, 0),
1968 "only named arguments may follow *expression");
1969 return NULL;
1970 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001971 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001973 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 asdl_seq_SET(args, nargs++, e);
1975 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001976 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001977 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001979 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001980 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001981 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001982 else {
1983 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001984 identifier key, tmp;
1985 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001986
Thomas Wouters89f507f2006-12-13 04:49:30 +00001987 /* CHILD(ch, 0) is test, but must be an identifier? */
1988 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001990 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 /* f(lambda x: x[0] = 3) ends up getting parsed with
1992 * LHS test = lambda x: x[0], and RHS test = 3.
1993 * SF bug 132313 points out that complaining about a keyword
1994 * then is very confusing.
1995 */
1996 if (e->kind == Lambda_kind) {
1997 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001998 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 } else if (e->kind != Name_kind) {
2000 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002001 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002002 } else if (forbidden_name(e, ch)) {
2003 return NULL;
2004 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002006 for (k = 0; k < nkeywords; k++) {
2007 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2008 if (!PyUnicode_Compare(tmp, key)) {
2009 ast_error(CHILD(ch, 0), "keyword argument repeated");
2010 return NULL;
2011 }
2012 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002015 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002016 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002018 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002019 asdl_seq_SET(keywords, nkeywords++, kw);
2020 }
2021 }
2022 else if (TYPE(ch) == STAR) {
2023 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002024 if (!vararg)
2025 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 i++;
2027 }
2028 else if (TYPE(ch) == DOUBLESTAR) {
2029 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002030 if (!kwarg)
2031 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 i++;
2033 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 }
2035
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002036 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002040ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002041{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002042 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002043 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002044 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002046 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002047 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002048 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002049 }
2050 else {
2051 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002052 TYPE(n) == testlist1);
2053 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002055 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056 else {
2057 asdl_seq *tmp = seq_for_testlist(c, n);
2058 if (!tmp)
2059 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002060 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002062}
2063
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064static stmt_ty
2065ast_for_expr_stmt(struct compiling *c, const node *n)
2066{
2067 REQ(n, expr_stmt);
2068 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2069 | ('=' (yield_expr|testlist))*)
2070 testlist: test (',' test)* [',']
2071 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002072 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 test: ... here starts the operator precendence dance
2074 */
2075
2076 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002077 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 if (!e)
2079 return NULL;
2080
Thomas Wouters89f507f2006-12-13 04:49:30 +00002081 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 }
2083 else if (TYPE(CHILD(n, 1)) == augassign) {
2084 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002085 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002086 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087
Thomas Wouters89f507f2006-12-13 04:49:30 +00002088 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089 if (!expr1)
2090 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002091 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002092 switch (expr1->kind) {
2093 case GeneratorExp_kind:
2094 ast_error(ch, "augmented assignment to generator "
2095 "expression not possible");
2096 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002097 case Yield_kind:
2098 ast_error(ch, "augmented assignment to yield "
2099 "expression not possible");
2100 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002101 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002102 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002103 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002104 break;
2105 }
2106 case Attribute_kind:
2107 case Subscript_kind:
2108 break;
2109 default:
2110 ast_error(ch, "illegal expression for augmented "
2111 "assignment");
2112 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002114 if(!set_context(c, expr1, Store, ch))
2115 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116
Thomas Wouters89f507f2006-12-13 04:49:30 +00002117 ch = CHILD(n, 2);
2118 if (TYPE(ch) == testlist)
2119 expr2 = ast_for_testlist(c, ch);
2120 else
2121 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002122 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 return NULL;
2124
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002125 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002126 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 return NULL;
2128
Thomas Wouters89f507f2006-12-13 04:49:30 +00002129 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002130 }
2131 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002132 int i;
2133 asdl_seq *targets;
2134 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 expr_ty expression;
2136
Thomas Wouters89f507f2006-12-13 04:49:30 +00002137 /* a normal assignment */
2138 REQ(CHILD(n, 1), EQUAL);
2139 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2140 if (!targets)
2141 return NULL;
2142 for (i = 0; i < NCH(n) - 2; i += 2) {
2143 expr_ty e;
2144 node *ch = CHILD(n, i);
2145 if (TYPE(ch) == yield_expr) {
2146 ast_error(ch, "assignment to yield expression not possible");
2147 return NULL;
2148 }
2149 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
Thomas Wouters89f507f2006-12-13 04:49:30 +00002151 /* set context to assign */
2152 if (!e)
2153 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002155 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002156 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157
Thomas Wouters89f507f2006-12-13 04:49:30 +00002158 asdl_seq_SET(targets, i / 2, e);
2159 }
2160 value = CHILD(n, NCH(n) - 1);
2161 if (TYPE(value) == testlist)
2162 expression = ast_for_testlist(c, value);
2163 else
2164 expression = ast_for_expr(c, value);
2165 if (!expression)
2166 return NULL;
2167 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169}
2170
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002172ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173{
2174 asdl_seq *seq;
2175 int i;
2176 expr_ty e;
2177
2178 REQ(n, exprlist);
2179
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002180 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002182 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002183 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002184 e = ast_for_expr(c, CHILD(n, i));
2185 if (!e)
2186 return NULL;
2187 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002188 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002189 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002190 }
2191 return seq;
2192}
2193
2194static stmt_ty
2195ast_for_del_stmt(struct compiling *c, const node *n)
2196{
2197 asdl_seq *expr_list;
2198
2199 /* del_stmt: 'del' exprlist */
2200 REQ(n, del_stmt);
2201
2202 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2203 if (!expr_list)
2204 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002205 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206}
2207
2208static stmt_ty
2209ast_for_flow_stmt(struct compiling *c, const node *n)
2210{
2211 /*
2212 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2213 | yield_stmt
2214 break_stmt: 'break'
2215 continue_stmt: 'continue'
2216 return_stmt: 'return' [testlist]
2217 yield_stmt: yield_expr
2218 yield_expr: 'yield' testlist
2219 raise_stmt: 'raise' [test [',' test [',' test]]]
2220 */
2221 node *ch;
2222
2223 REQ(n, flow_stmt);
2224 ch = CHILD(n, 0);
2225 switch (TYPE(ch)) {
2226 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002227 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002229 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002231 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2232 if (!exp)
2233 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002234 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235 }
2236 case return_stmt:
2237 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002238 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002239 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002240 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 if (!expression)
2242 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002243 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244 }
2245 case raise_stmt:
2246 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002247 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2248 else if (NCH(ch) >= 2) {
2249 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2251 if (!expression)
2252 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002253 if (NCH(ch) == 4) {
2254 cause = ast_for_expr(c, CHILD(ch, 3));
2255 if (!cause)
2256 return NULL;
2257 }
2258 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 }
2260 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002261 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 "unexpected flow_stmt: %d", TYPE(ch));
2263 return NULL;
2264 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002265
2266 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2267 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268}
2269
2270static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002271alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272{
2273 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002274 import_as_name: NAME ['as' NAME]
2275 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002276 dotted_name: NAME ('.' NAME)*
2277 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002278 PyObject *str;
2279
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 loop:
2281 switch (TYPE(n)) {
2282 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002283 str = NULL;
2284 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002285 str = NEW_IDENTIFIER(CHILD(n, 2));
2286 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002287 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 case dotted_as_name:
2289 if (NCH(n) == 1) {
2290 n = CHILD(n, 0);
2291 goto loop;
2292 }
2293 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002294 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002295 if (!a)
2296 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 assert(!a->asname);
2298 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2299 return a;
2300 }
2301 break;
2302 case dotted_name:
2303 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002304 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 else {
2306 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002307 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002308 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002310 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311
2312 len = 0;
2313 for (i = 0; i < NCH(n); i += 2)
2314 /* length of string plus one for the dot */
2315 len += strlen(STR(CHILD(n, i))) + 1;
2316 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002317 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318 if (!str)
2319 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002320 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 if (!s)
2322 return NULL;
2323 for (i = 0; i < NCH(n); i += 2) {
2324 char *sch = STR(CHILD(n, i));
2325 strcpy(s, STR(CHILD(n, i)));
2326 s += strlen(sch);
2327 *s++ = '.';
2328 }
2329 --s;
2330 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002331 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2332 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002333 NULL);
2334 Py_DECREF(str);
2335 if (!uni)
2336 return NULL;
2337 str = uni;
2338 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002339 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002340 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 }
2342 break;
2343 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002344 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002345 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002346 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002348 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 "unexpected import name: %d", TYPE(n));
2350 return NULL;
2351 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002352
2353 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 return NULL;
2355}
2356
2357static stmt_ty
2358ast_for_import_stmt(struct compiling *c, const node *n)
2359{
2360 /*
2361 import_stmt: import_name | import_from
2362 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002363 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2364 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002366 int lineno;
2367 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 int i;
2369 asdl_seq *aliases;
2370
2371 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002372 lineno = LINENO(n);
2373 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002375 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002377 REQ(n, dotted_as_names);
2378 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2379 if (!aliases)
2380 return NULL;
2381 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002382 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002383 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002385 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002389 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002391 int idx, ndots = 0;
2392 alias_ty mod = NULL;
2393 identifier modname;
2394
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002395 /* Count the number of dots (for relative imports) and check for the
2396 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002397 for (idx = 1; idx < NCH(n); idx++) {
2398 if (TYPE(CHILD(n, idx)) == dotted_name) {
2399 mod = alias_for_import_name(c, CHILD(n, idx));
2400 idx++;
2401 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002402 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2403 /* three consecutive dots are tokenized as one ELLIPSIS */
2404 ndots += 3;
2405 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002406 } else if (TYPE(CHILD(n, idx)) != DOT) {
2407 break;
2408 }
2409 ndots++;
2410 }
2411 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002412 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002413 case STAR:
2414 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002415 n = CHILD(n, idx);
2416 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002417 break;
2418 case LPAR:
2419 /* from ... import (x, y, z) */
2420 n = CHILD(n, idx + 1);
2421 n_children = NCH(n);
2422 break;
2423 case import_as_names:
2424 /* from ... import x, y, z */
2425 n = CHILD(n, idx);
2426 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002427 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428 ast_error(n, "trailing comma not allowed without"
2429 " surrounding parentheses");
2430 return NULL;
2431 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002432 break;
2433 default:
2434 ast_error(n, "Unexpected node-type in from-import");
2435 return NULL;
2436 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002437
Thomas Wouters89f507f2006-12-13 04:49:30 +00002438 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2439 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441
2442 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002443 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002444 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002445 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002447 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002449 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002450 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002451 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2452 if (!import_alias)
2453 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002454 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002455 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002457 if (mod != NULL)
2458 modname = mod->name;
2459 else
2460 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002461 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002462 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 }
Neal Norwitz79792652005-11-14 04:25:03 +00002464 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 "unknown import statement: starts with command '%s'",
2466 STR(CHILD(n, 0)));
2467 return NULL;
2468}
2469
2470static stmt_ty
2471ast_for_global_stmt(struct compiling *c, const node *n)
2472{
2473 /* global_stmt: 'global' NAME (',' NAME)* */
2474 identifier name;
2475 asdl_seq *s;
2476 int i;
2477
2478 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002479 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002480 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002481 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002483 name = NEW_IDENTIFIER(CHILD(n, i));
2484 if (!name)
2485 return NULL;
2486 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002488 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489}
2490
2491static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002492ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2493{
2494 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2495 identifier name;
2496 asdl_seq *s;
2497 int i;
2498
2499 REQ(n, nonlocal_stmt);
2500 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2501 if (!s)
2502 return NULL;
2503 for (i = 1; i < NCH(n); i += 2) {
2504 name = NEW_IDENTIFIER(CHILD(n, i));
2505 if (!name)
2506 return NULL;
2507 asdl_seq_SET(s, i / 2, name);
2508 }
2509 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2510}
2511
2512static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513ast_for_assert_stmt(struct compiling *c, const node *n)
2514{
2515 /* assert_stmt: 'assert' test [',' test] */
2516 REQ(n, assert_stmt);
2517 if (NCH(n) == 2) {
2518 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2519 if (!expression)
2520 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002521 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 }
2523 else if (NCH(n) == 4) {
2524 expr_ty expr1, expr2;
2525
2526 expr1 = ast_for_expr(c, CHILD(n, 1));
2527 if (!expr1)
2528 return NULL;
2529 expr2 = ast_for_expr(c, CHILD(n, 3));
2530 if (!expr2)
2531 return NULL;
2532
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 }
Neal Norwitz79792652005-11-14 04:25:03 +00002535 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536 "improper number of parts to 'assert' statement: %d",
2537 NCH(n));
2538 return NULL;
2539}
2540
2541static asdl_seq *
2542ast_for_suite(struct compiling *c, const node *n)
2543{
2544 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002545 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 stmt_ty s;
2547 int i, total, num, end, pos = 0;
2548 node *ch;
2549
2550 REQ(n, suite);
2551
2552 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002553 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002555 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002556 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002557 n = CHILD(n, 0);
2558 /* simple_stmt always ends with a NEWLINE,
2559 and may have a trailing SEMI
2560 */
2561 end = NCH(n) - 1;
2562 if (TYPE(CHILD(n, end - 1)) == SEMI)
2563 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002565 for (i = 0; i < end; i += 2) {
2566 ch = CHILD(n, i);
2567 s = ast_for_stmt(c, ch);
2568 if (!s)
2569 return NULL;
2570 asdl_seq_SET(seq, pos++, s);
2571 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572 }
2573 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002574 for (i = 2; i < (NCH(n) - 1); i++) {
2575 ch = CHILD(n, i);
2576 REQ(ch, stmt);
2577 num = num_stmts(ch);
2578 if (num == 1) {
2579 /* small_stmt or compound_stmt with only one child */
2580 s = ast_for_stmt(c, ch);
2581 if (!s)
2582 return NULL;
2583 asdl_seq_SET(seq, pos++, s);
2584 }
2585 else {
2586 int j;
2587 ch = CHILD(ch, 0);
2588 REQ(ch, simple_stmt);
2589 for (j = 0; j < NCH(ch); j += 2) {
2590 /* statement terminates with a semi-colon ';' */
2591 if (NCH(CHILD(ch, j)) == 0) {
2592 assert((j + 1) == NCH(ch));
2593 break;
2594 }
2595 s = ast_for_stmt(c, CHILD(ch, j));
2596 if (!s)
2597 return NULL;
2598 asdl_seq_SET(seq, pos++, s);
2599 }
2600 }
2601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 }
2603 assert(pos == seq->size);
2604 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605}
2606
2607static stmt_ty
2608ast_for_if_stmt(struct compiling *c, const node *n)
2609{
2610 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2611 ['else' ':' suite]
2612 */
2613 char *s;
2614
2615 REQ(n, if_stmt);
2616
2617 if (NCH(n) == 4) {
2618 expr_ty expression;
2619 asdl_seq *suite_seq;
2620
2621 expression = ast_for_expr(c, CHILD(n, 1));
2622 if (!expression)
2623 return NULL;
2624 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002625 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 return NULL;
2627
Guido van Rossumd8faa362007-04-27 19:54:29 +00002628 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2629 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002631
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 s = STR(CHILD(n, 4));
2633 /* s[2], the third character in the string, will be
2634 's' for el_s_e, or
2635 'i' for el_i_f
2636 */
2637 if (s[2] == 's') {
2638 expr_ty expression;
2639 asdl_seq *seq1, *seq2;
2640
2641 expression = ast_for_expr(c, CHILD(n, 1));
2642 if (!expression)
2643 return NULL;
2644 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002645 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646 return NULL;
2647 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002648 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 return NULL;
2650
Guido van Rossumd8faa362007-04-27 19:54:29 +00002651 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2652 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653 }
2654 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002655 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002656 expr_ty expression;
2657 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002658 asdl_seq *orelse = NULL;
2659 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660 /* must reference the child n_elif+1 since 'else' token is third,
2661 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002662 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2663 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2664 has_else = 1;
2665 n_elif -= 3;
2666 }
2667 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668
Thomas Wouters89f507f2006-12-13 04:49:30 +00002669 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002670 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671
Thomas Wouters89f507f2006-12-13 04:49:30 +00002672 orelse = asdl_seq_new(1, c->c_arena);
2673 if (!orelse)
2674 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002676 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002678 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2679 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2682 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684
Guido van Rossumd8faa362007-04-27 19:54:29 +00002685 asdl_seq_SET(orelse, 0,
2686 If(expression, suite_seq, suite_seq2,
2687 LINENO(CHILD(n, NCH(n) - 6)),
2688 CHILD(n, NCH(n) - 6)->n_col_offset,
2689 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002690 /* the just-created orelse handled the last elif */
2691 n_elif--;
2692 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693
Thomas Wouters89f507f2006-12-13 04:49:30 +00002694 for (i = 0; i < n_elif; i++) {
2695 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002696 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2697 if (!newobj)
2698 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002700 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002703 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705
Thomas Wouters89f507f2006-12-13 04:49:30 +00002706 asdl_seq_SET(newobj, 0,
2707 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002708 LINENO(CHILD(n, off)),
2709 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002710 orelse = newobj;
2711 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002712 expression = ast_for_expr(c, CHILD(n, 1));
2713 if (!expression)
2714 return NULL;
2715 suite_seq = ast_for_suite(c, CHILD(n, 3));
2716 if (!suite_seq)
2717 return NULL;
2718 return If(expression, suite_seq, orelse,
2719 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002721
2722 PyErr_Format(PyExc_SystemError,
2723 "unexpected token in 'if' statement: %s", s);
2724 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725}
2726
2727static stmt_ty
2728ast_for_while_stmt(struct compiling *c, const node *n)
2729{
2730 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2731 REQ(n, while_stmt);
2732
2733 if (NCH(n) == 4) {
2734 expr_ty expression;
2735 asdl_seq *suite_seq;
2736
2737 expression = ast_for_expr(c, CHILD(n, 1));
2738 if (!expression)
2739 return NULL;
2740 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002741 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002743 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 }
2745 else if (NCH(n) == 7) {
2746 expr_ty expression;
2747 asdl_seq *seq1, *seq2;
2748
2749 expression = ast_for_expr(c, CHILD(n, 1));
2750 if (!expression)
2751 return NULL;
2752 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002753 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754 return NULL;
2755 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002756 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757 return NULL;
2758
Thomas Wouters89f507f2006-12-13 04:49:30 +00002759 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002761
2762 PyErr_Format(PyExc_SystemError,
2763 "wrong number of tokens for 'while' statement: %d",
2764 NCH(n));
2765 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766}
2767
2768static stmt_ty
2769ast_for_for_stmt(struct compiling *c, const node *n)
2770{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002771 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 expr_ty expression;
2773 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002774 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002775 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2776 REQ(n, for_stmt);
2777
2778 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002779 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780 if (!seq)
2781 return NULL;
2782 }
2783
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002784 node_target = CHILD(n, 1);
2785 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002786 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002788 /* Check the # of children rather than the length of _target, since
2789 for x, in ... has 1 element in _target, but still requires a Tuple. */
2790 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002791 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002793 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002795 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002796 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797 return NULL;
2798 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002799 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800 return NULL;
2801
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002802 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2803 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002804}
2805
2806static excepthandler_ty
2807ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2808{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002809 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 REQ(exc, except_clause);
2811 REQ(body, suite);
2812
2813 if (NCH(exc) == 1) {
2814 asdl_seq *suite_seq = ast_for_suite(c, body);
2815 if (!suite_seq)
2816 return NULL;
2817
Neal Norwitzad74aa82008-03-31 05:14:30 +00002818 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002819 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820 }
2821 else if (NCH(exc) == 2) {
2822 expr_ty expression;
2823 asdl_seq *suite_seq;
2824
2825 expression = ast_for_expr(c, CHILD(exc, 1));
2826 if (!expression)
2827 return NULL;
2828 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002829 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830 return NULL;
2831
Neal Norwitzad74aa82008-03-31 05:14:30 +00002832 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002833 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834 }
2835 else if (NCH(exc) == 4) {
2836 asdl_seq *suite_seq;
2837 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002838 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002839 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002842 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843 return NULL;
2844 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002845 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846 return NULL;
2847
Neal Norwitzad74aa82008-03-31 05:14:30 +00002848 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002849 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002850 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002851
2852 PyErr_Format(PyExc_SystemError,
2853 "wrong number of children for 'except' clause: %d",
2854 NCH(exc));
2855 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002856}
2857
2858static stmt_ty
2859ast_for_try_stmt(struct compiling *c, const node *n)
2860{
Neal Norwitzf599f422005-12-17 21:33:47 +00002861 const int nch = NCH(n);
2862 int n_except = (nch - 3)/3;
2863 asdl_seq *body, *orelse = NULL, *finally = NULL;
2864
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002865 REQ(n, try_stmt);
2866
Neal Norwitzf599f422005-12-17 21:33:47 +00002867 body = ast_for_suite(c, CHILD(n, 2));
2868 if (body == NULL)
2869 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002870
Neal Norwitzf599f422005-12-17 21:33:47 +00002871 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2872 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2873 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2874 /* we can assume it's an "else",
2875 because nch >= 9 for try-else-finally and
2876 it would otherwise have a type of except_clause */
2877 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2878 if (orelse == NULL)
2879 return NULL;
2880 n_except--;
2881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882
Neal Norwitzf599f422005-12-17 21:33:47 +00002883 finally = ast_for_suite(c, CHILD(n, nch - 1));
2884 if (finally == NULL)
2885 return NULL;
2886 n_except--;
2887 }
2888 else {
2889 /* we can assume it's an "else",
2890 otherwise it would have a type of except_clause */
2891 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2892 if (orelse == NULL)
2893 return NULL;
2894 n_except--;
2895 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002896 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002897 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002898 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899 return NULL;
2900 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002901
2902 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002903 int i;
2904 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002905 /* process except statements to create a try ... except */
2906 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2907 if (handlers == NULL)
2908 return NULL;
2909
2910 for (i = 0; i < n_except; i++) {
2911 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2912 CHILD(n, 5 + i * 3));
2913 if (!e)
2914 return NULL;
2915 asdl_seq_SET(handlers, i, e);
2916 }
2917
Thomas Wouters89f507f2006-12-13 04:49:30 +00002918 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002919 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002920 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002921 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002922
2923 /* if a 'finally' is present too, we nest the TryExcept within a
2924 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002925 body = asdl_seq_new(1, c->c_arena);
2926 if (body == NULL)
2927 return NULL;
2928 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002929 }
2930
2931 /* must be a try ... finally (except clauses are in body, if any exist) */
2932 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002933 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002934}
2935
Guido van Rossumc2e20742006-02-27 22:32:47 +00002936static expr_ty
2937ast_for_with_var(struct compiling *c, const node *n)
2938{
2939 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002940 return ast_for_expr(c, CHILD(n, 1));
2941}
2942
2943/* with_stmt: 'with' test [ with_var ] ':' suite */
2944static stmt_ty
2945ast_for_with_stmt(struct compiling *c, const node *n)
2946{
2947 expr_ty context_expr, optional_vars = NULL;
2948 int suite_index = 3; /* skip 'with', test, and ':' */
2949 asdl_seq *suite_seq;
2950
2951 assert(TYPE(n) == with_stmt);
2952 context_expr = ast_for_expr(c, CHILD(n, 1));
2953 if (TYPE(CHILD(n, 2)) == with_var) {
2954 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2955
2956 if (!optional_vars) {
2957 return NULL;
2958 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002959 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002960 return NULL;
2961 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002962 suite_index = 4;
2963 }
2964
2965 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2966 if (!suite_seq) {
2967 return NULL;
2968 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002969 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002970 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002971}
2972
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002974ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002976 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2977 asdl_seq *s;
2978 expr_ty call, dummy;
2979
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 REQ(n, classdef);
2981
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002982 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 s = ast_for_suite(c, CHILD(n, 3));
2984 if (!s)
2985 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002986 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002987 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002989
2990 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002991 s = ast_for_suite(c, CHILD(n,5));
2992 if (!s)
2993 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002994 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002995 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 }
2997
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002998 /* class NAME '(' arglist ')' ':' suite */
2999 /* build up a fake Call node so we can extract its pieces */
3000 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3001 call = ast_for_call(c, CHILD(n, 3), dummy);
3002 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003005 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003007
3008 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
3009 call->v.Call.args, call->v.Call.keywords,
3010 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003011 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003012}
3013
3014static stmt_ty
3015ast_for_stmt(struct compiling *c, const node *n)
3016{
3017 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003018 assert(NCH(n) == 1);
3019 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 }
3021 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003022 assert(num_stmts(n) == 1);
3023 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024 }
3025 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003026 REQ(n, small_stmt);
3027 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003028 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3029 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003030 */
3031 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003032 case expr_stmt:
3033 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 case del_stmt:
3035 return ast_for_del_stmt(c, n);
3036 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003037 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 case flow_stmt:
3039 return ast_for_flow_stmt(c, n);
3040 case import_stmt:
3041 return ast_for_import_stmt(c, n);
3042 case global_stmt:
3043 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003044 case nonlocal_stmt:
3045 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046 case assert_stmt:
3047 return ast_for_assert_stmt(c, n);
3048 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003049 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3051 TYPE(n), NCH(n));
3052 return NULL;
3053 }
3054 }
3055 else {
3056 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003057 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003058 */
3059 node *ch = CHILD(n, 0);
3060 REQ(n, compound_stmt);
3061 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 case if_stmt:
3063 return ast_for_if_stmt(c, ch);
3064 case while_stmt:
3065 return ast_for_while_stmt(c, ch);
3066 case for_stmt:
3067 return ast_for_for_stmt(c, ch);
3068 case try_stmt:
3069 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003070 case with_stmt:
3071 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003073 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003075 return ast_for_classdef(c, ch, NULL);
3076 case decorated:
3077 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003079 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3081 TYPE(n), NCH(n));
3082 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003083 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084 }
3085}
3086
3087static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003088parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003090 const char *end;
3091 long x;
3092 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003094 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003095 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096#endif
3097
Guido van Rossumd8faa362007-04-27 19:54:29 +00003098 errno = 0;
3099 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003101 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003103 if (s[0] == '0') {
3104 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3105 if (x < 0 && errno == 0) {
3106 return PyLong_FromString((char *)s,
3107 (char **)0,
3108 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003109 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003110 }
3111 else
3112 x = PyOS_strtol((char *)s, (char **)&end, 0);
3113 if (*end == '\0') {
3114 if (errno != 0)
3115 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003116 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003117 }
3118 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003120 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003121 compl.real = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003122 PyFPE_START_PROTECT("atof", return 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003123 compl.imag = PyOS_ascii_atof(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003124 PyFPE_END_PROTECT(c)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003125 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003126 }
3127 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003129 {
3130 PyFPE_START_PROTECT("atof", return 0)
3131 dx = PyOS_ascii_atof(s);
3132 PyFPE_END_PROTECT(dx)
3133 return PyFloat_FromDouble(dx);
3134 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135}
3136
3137static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003138decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003140 PyObject *u, *v;
3141 char *s, *t;
3142 t = s = (char *)*sPtr;
3143 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3144 while (s < end && (*s & 0x80)) s++;
3145 *sPtr = s;
3146 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3147 if (u == NULL)
3148 return NULL;
3149 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3150 Py_DECREF(u);
3151 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003152}
3153
3154static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003155decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003157 PyObject *v, *u;
3158 char *buf;
3159 char *p;
3160 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003161
Guido van Rossumd8faa362007-04-27 19:54:29 +00003162 if (encoding == NULL) {
3163 buf = (char *)s;
3164 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003165 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003166 /* check for integer overflow */
3167 if (len > PY_SIZE_MAX / 4)
3168 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003169 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003170 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003171 if (u == NULL)
3172 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003173 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003174 end = s + len;
3175 while (s < end) {
3176 if (*s == '\\') {
3177 *p++ = *s++;
3178 if (*s & 0x80) {
3179 strcpy(p, "u005c");
3180 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 }
3183 if (*s & 0x80) { /* XXX inefficient */
3184 PyObject *w;
3185 char *r;
3186 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003187 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003188 if (w == NULL) {
3189 Py_DECREF(u);
3190 return NULL;
3191 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003192 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003193 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003194 assert(rn % 2 == 0);
3195 for (i = 0; i < rn; i += 2) {
3196 sprintf(p, "\\u%02x%02x",
3197 r[i + 0] & 0xFF,
3198 r[i + 1] & 0xFF);
3199 p += 6;
3200 }
3201 Py_DECREF(w);
3202 } else {
3203 *p++ = *s++;
3204 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003205 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003206 len = p - buf;
3207 s = buf;
3208 }
3209 if (rawmode)
3210 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3211 else
3212 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3213 Py_XDECREF(u);
3214 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215}
3216
3217/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003218 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219 * parsestr parses it, and returns the decoded Python string object.
3220 */
3221static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003222parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003224 size_t len;
3225 const char *s = STR(n);
3226 int quote = Py_CHARMASK(*s);
3227 int rawmode = 0;
3228 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003229 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230 if (quote == 'b' || quote == 'B') {
3231 quote = *++s;
3232 *bytesmode = 1;
3233 }
3234 if (quote == 'r' || quote == 'R') {
3235 quote = *++s;
3236 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 }
3239 if (quote != '\'' && quote != '\"') {
3240 PyErr_BadInternalCall();
3241 return NULL;
3242 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003243 s++;
3244 len = strlen(s);
3245 if (len > INT_MAX) {
3246 PyErr_SetString(PyExc_OverflowError,
3247 "string to parse is too long");
3248 return NULL;
3249 }
3250 if (s[--len] != quote) {
3251 PyErr_BadInternalCall();
3252 return NULL;
3253 }
3254 if (len >= 4 && s[0] == quote && s[1] == quote) {
3255 s += 2;
3256 len -= 2;
3257 if (s[--len] != quote || s[--len] != quote) {
3258 PyErr_BadInternalCall();
3259 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003260 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003262 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003263 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 if (*bytesmode) {
3266 /* Disallow non-ascii characters (but not escapes) */
3267 const char *c;
3268 for (c = s; *c; c++) {
3269 if (Py_CHARMASK(*c) >= 0x80) {
3270 ast_error(n, "bytes can only contain ASCII "
3271 "literal characters.");
3272 return NULL;
3273 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003274 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003275 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003276 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003277 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003278 if (rawmode || strchr(s, '\\') == NULL) {
3279 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003280 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003281 if (u == NULL || !*bytesmode)
3282 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003283 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003284 Py_DECREF(u);
3285 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003286 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003287 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003288 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003289 return PyUnicode_FromStringAndSize(s, len);
3290 } else {
3291 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003292 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003293 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003294 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003295 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003296}
3297
Guido van Rossum29fd7122007-11-12 01:13:56 +00003298/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299 * compile-time literal catenation, calling parsestr() on each piece, and
3300 * pasting the intermediate results together.
3301 */
3302static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003303parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003304{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 PyObject *v;
3306 int i;
3307 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003308 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003309 if (v != NULL) {
3310 /* String literal concatenation */
3311 for (i = 1; i < NCH(n); i++) {
3312 PyObject *s;
3313 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003314 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003315 if (s == NULL)
3316 goto onError;
3317 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003318 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003319 goto onError;
3320 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003321 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3322 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003323 if (v == NULL)
3324 goto onError;
3325 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003326 else {
3327 PyObject *temp = PyUnicode_Concat(v, s);
3328 Py_DECREF(s);
3329 Py_DECREF(v);
3330 v = temp;
3331 if (v == NULL)
3332 goto onError;
3333 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003334 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003335 }
3336 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337
Guido van Rossumd8faa362007-04-27 19:54:29 +00003338 onError:
3339 Py_XDECREF(v);
3340 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341}