blob: 1cf100e449204477d4bd983af4d1d7786f94d779 [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);
1324 errstr = ((PyUnicodeErrorObject *)value)->reason;
1325 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);
1331 } else {
1332 ast_error(n, "(unicode error) unknown error");
1333 }
1334 Py_DECREF(type);
1335 Py_DECREF(value);
1336 Py_XDECREF(tback);
1337 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001339 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001340 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001341 if (bytesmode)
1342 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1343 else
1344 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345 }
1346 case NUMBER: {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001347 PyObject *pynum = parsenumber(c, STR(ch));
Thomas Wouters89f507f2006-12-13 04:49:30 +00001348 if (!pynum)
1349 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001350
Thomas Wouters89f507f2006-12-13 04:49:30 +00001351 PyArena_AddPyObject(c->c_arena, pynum);
1352 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 }
Georg Brandldde00282007-03-18 19:01:53 +00001354 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001355 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001357 ch = CHILD(n, 1);
1358
1359 if (TYPE(ch) == RPAR)
1360 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1361
1362 if (TYPE(ch) == yield_expr)
1363 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001364
1365 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1366 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001367 return ast_for_genexp(c, ch);
1368
Nick Coghlan650f0d02007-04-15 12:05:43 +00001369 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001371 ch = CHILD(n, 1);
1372
1373 if (TYPE(ch) == RSQB)
1374 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1375
Nick Coghlan650f0d02007-04-15 12:05:43 +00001376 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001377 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1378 asdl_seq *elts = seq_for_testlist(c, ch);
1379 if (!elts)
1380 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001381
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1383 }
1384 else
1385 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001387 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1388 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001389 int i, size;
1390 asdl_seq *keys, *values;
1391
1392 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001393 if (TYPE(ch) == RBRACE) {
1394 /* it's an empty dict */
1395 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1396 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1397 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001398 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001399 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001400 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001401 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001402 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001403 for (i = 0; i < NCH(ch); i += 2) {
1404 expr_ty expression;
1405 expression = ast_for_expr(c, CHILD(ch, i));
1406 if (!expression)
1407 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001408 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001409 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001410 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1411 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1412 /* it's a set comprehension */
1413 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001414 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1415 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001416 } else {
1417 /* it's a dict */
1418 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1419 keys = asdl_seq_new(size, c->c_arena);
1420 if (!keys)
1421 return NULL;
1422
1423 values = asdl_seq_new(size, c->c_arena);
1424 if (!values)
1425 return NULL;
1426
1427 for (i = 0; i < NCH(ch); i += 4) {
1428 expr_ty expression;
1429
1430 expression = ast_for_expr(c, CHILD(ch, i));
1431 if (!expression)
1432 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001433
Guido van Rossum86e58e22006-08-28 15:27:34 +00001434 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001435
Guido van Rossum86e58e22006-08-28 15:27:34 +00001436 expression = ast_for_expr(c, CHILD(ch, i + 2));
1437 if (!expression)
1438 return NULL;
1439
1440 asdl_seq_SET(values, i / 4, expression);
1441 }
1442 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1443 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001446 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1447 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 }
1449}
1450
1451static slice_ty
1452ast_for_slice(struct compiling *c, const node *n)
1453{
1454 node *ch;
1455 expr_ty lower = NULL, upper = NULL, step = NULL;
1456
1457 REQ(n, subscript);
1458
1459 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001460 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 sliceop: ':' [test]
1462 */
1463 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464 if (NCH(n) == 1 && TYPE(ch) == test) {
1465 /* 'step' variable hold no significance in terms of being used over
1466 other vars */
1467 step = ast_for_expr(c, ch);
1468 if (!step)
1469 return NULL;
1470
Thomas Wouters89f507f2006-12-13 04:49:30 +00001471 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472 }
1473
1474 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001475 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 if (!lower)
1477 return NULL;
1478 }
1479
1480 /* If there's an upper bound it's in the second or third position. */
1481 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001482 if (NCH(n) > 1) {
1483 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001484
Thomas Wouters89f507f2006-12-13 04:49:30 +00001485 if (TYPE(n2) == test) {
1486 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001487 if (!upper)
1488 return NULL;
1489 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001490 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001492 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493
Thomas Wouters89f507f2006-12-13 04:49:30 +00001494 if (TYPE(n2) == test) {
1495 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496 if (!upper)
1497 return NULL;
1498 }
1499 }
1500
1501 ch = CHILD(n, NCH(n) - 1);
1502 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503 if (NCH(ch) == 1) {
1504 /* No expression, so step is None */
1505 ch = CHILD(ch, 0);
1506 step = Name(new_identifier("None", c->c_arena), Load,
1507 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508 if (!step)
1509 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001510 } else {
1511 ch = CHILD(ch, 1);
1512 if (TYPE(ch) == test) {
1513 step = ast_for_expr(c, ch);
1514 if (!step)
1515 return NULL;
1516 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517 }
1518 }
1519
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001520 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521}
1522
1523static expr_ty
1524ast_for_binop(struct compiling *c, const node *n)
1525{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001526 /* Must account for a sequence of expressions.
1527 How should A op B op C by represented?
1528 BinOp(BinOp(A, op, B), op, C).
1529 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530
Guido van Rossumd8faa362007-04-27 19:54:29 +00001531 int i, nops;
1532 expr_ty expr1, expr2, result;
1533 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534
Guido van Rossumd8faa362007-04-27 19:54:29 +00001535 expr1 = ast_for_expr(c, CHILD(n, 0));
1536 if (!expr1)
1537 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538
Guido van Rossumd8faa362007-04-27 19:54:29 +00001539 expr2 = ast_for_expr(c, CHILD(n, 2));
1540 if (!expr2)
1541 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542
Guido van Rossumd8faa362007-04-27 19:54:29 +00001543 newoperator = get_operator(CHILD(n, 1));
1544 if (!newoperator)
1545 return NULL;
1546
1547 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1548 c->c_arena);
1549 if (!result)
1550 return NULL;
1551
1552 nops = (NCH(n) - 1) / 2;
1553 for (i = 1; i < nops; i++) {
1554 expr_ty tmp_result, tmp;
1555 const node* next_oper = CHILD(n, i * 2 + 1);
1556
1557 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001558 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 return NULL;
1560
Guido van Rossumd8faa362007-04-27 19:54:29 +00001561 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1562 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001563 return NULL;
1564
Guido van Rossumd8faa362007-04-27 19:54:29 +00001565 tmp_result = BinOp(result, newoperator, tmp,
1566 LINENO(next_oper), next_oper->n_col_offset,
1567 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001568 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001569 return NULL;
1570 result = tmp_result;
1571 }
1572 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573}
1574
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001575static expr_ty
1576ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1577{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001578 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1579 subscriptlist: subscript (',' subscript)* [',']
1580 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1581 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001582 REQ(n, trailer);
1583 if (TYPE(CHILD(n, 0)) == LPAR) {
1584 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001585 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1586 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001587 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001588 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001589 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001590 else if (TYPE(CHILD(n, 0)) == DOT ) {
1591 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001592 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001593 }
1594 else {
1595 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001596 REQ(CHILD(n, 2), RSQB);
1597 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001598 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001599 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1600 if (!slc)
1601 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001602 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1603 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001604 }
1605 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001606 /* The grammar is ambiguous here. The ambiguity is resolved
1607 by treating the sequence as a tuple literal if there are
1608 no slice features.
1609 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001610 int j;
1611 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001612 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001613 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001614 asdl_seq *slices, *elts;
1615 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001616 if (!slices)
1617 return NULL;
1618 for (j = 0; j < NCH(n); j += 2) {
1619 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001620 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001621 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001622 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001623 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001624 asdl_seq_SET(slices, j / 2, slc);
1625 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001626 if (!simple) {
1627 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001628 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001629 }
1630 /* extract Index values and put them in a Tuple */
1631 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001632 if (!elts)
1633 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001634 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1635 slc = (slice_ty)asdl_seq_GET(slices, j);
1636 assert(slc->kind == Index_kind && slc->v.Index.value);
1637 asdl_seq_SET(elts, j, slc->v.Index.value);
1638 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001639 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001640 if (!e)
1641 return NULL;
1642 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001643 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001644 }
1645 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001646}
1647
1648static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001649ast_for_factor(struct compiling *c, const node *n)
1650{
1651 node *pfactor, *ppower, *patom, *pnum;
1652 expr_ty expression;
1653
1654 /* If the unary - operator is applied to a constant, don't generate
1655 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1656 constant. The peephole optimizer already does something like
1657 this but it doesn't handle the case where the constant is
1658 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1659 PyLongObject.
1660 */
1661 if (TYPE(CHILD(n, 0)) == MINUS
1662 && NCH(n) == 2
1663 && TYPE((pfactor = CHILD(n, 1))) == factor
1664 && NCH(pfactor) == 1
1665 && TYPE((ppower = CHILD(pfactor, 0))) == power
1666 && NCH(ppower) == 1
1667 && TYPE((patom = CHILD(ppower, 0))) == atom
1668 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1669 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1670 if (s == NULL)
1671 return NULL;
1672 s[0] = '-';
1673 strcpy(s + 1, STR(pnum));
1674 PyObject_FREE(STR(pnum));
1675 STR(pnum) = s;
1676 return ast_for_atom(c, patom);
1677 }
1678
1679 expression = ast_for_expr(c, CHILD(n, 1));
1680 if (!expression)
1681 return NULL;
1682
1683 switch (TYPE(CHILD(n, 0))) {
1684 case PLUS:
1685 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1686 c->c_arena);
1687 case MINUS:
1688 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1689 c->c_arena);
1690 case TILDE:
1691 return UnaryOp(Invert, expression, LINENO(n),
1692 n->n_col_offset, c->c_arena);
1693 }
1694 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1695 TYPE(CHILD(n, 0)));
1696 return NULL;
1697}
1698
1699static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001700ast_for_power(struct compiling *c, const node *n)
1701{
1702 /* power: atom trailer* ('**' factor)*
1703 */
1704 int i;
1705 expr_ty e, tmp;
1706 REQ(n, power);
1707 e = ast_for_atom(c, CHILD(n, 0));
1708 if (!e)
1709 return NULL;
1710 if (NCH(n) == 1)
1711 return e;
1712 for (i = 1; i < NCH(n); i++) {
1713 node *ch = CHILD(n, i);
1714 if (TYPE(ch) != trailer)
1715 break;
1716 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001717 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001718 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001719 tmp->lineno = e->lineno;
1720 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001721 e = tmp;
1722 }
1723 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1724 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001725 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001726 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001727 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001728 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001729 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001730 e = tmp;
1731 }
1732 return e;
1733}
1734
Guido van Rossum0368b722007-05-11 16:50:42 +00001735static expr_ty
1736ast_for_starred(struct compiling *c, const node *n)
1737{
1738 expr_ty tmp;
1739 REQ(n, star_expr);
1740
1741 tmp = ast_for_expr(c, CHILD(n, 1));
1742 if (!tmp)
1743 return NULL;
1744
1745 /* The Load context is changed later. */
1746 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1747}
1748
1749
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001750/* Do not name a variable 'expr'! Will cause a compile error.
1751*/
1752
1753static expr_ty
1754ast_for_expr(struct compiling *c, const node *n)
1755{
1756 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001757 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001758 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001759 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760 and_test: not_test ('and' not_test)*
1761 not_test: 'not' not_test | comparison
1762 comparison: expr (comp_op expr)*
1763 expr: xor_expr ('|' xor_expr)*
1764 xor_expr: and_expr ('^' and_expr)*
1765 and_expr: shift_expr ('&' shift_expr)*
1766 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1767 arith_expr: term (('+'|'-') term)*
1768 term: factor (('*'|'/'|'%'|'//') factor)*
1769 factor: ('+'|'-'|'~') factor | power
1770 power: atom trailer* ('**' factor)*
1771 */
1772
1773 asdl_seq *seq;
1774 int i;
1775
1776 loop:
1777 switch (TYPE(n)) {
1778 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001779 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001780 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001781 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001783 else if (NCH(n) > 1)
1784 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001785 /* Fallthrough */
1786 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 case and_test:
1788 if (NCH(n) == 1) {
1789 n = CHILD(n, 0);
1790 goto loop;
1791 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001792 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 if (!seq)
1794 return NULL;
1795 for (i = 0; i < NCH(n); i += 2) {
1796 expr_ty e = ast_for_expr(c, CHILD(n, i));
1797 if (!e)
1798 return NULL;
1799 asdl_seq_SET(seq, i / 2, e);
1800 }
1801 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1803 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001804 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001805 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806 case not_test:
1807 if (NCH(n) == 1) {
1808 n = CHILD(n, 0);
1809 goto loop;
1810 }
1811 else {
1812 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1813 if (!expression)
1814 return NULL;
1815
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1817 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818 }
1819 case comparison:
1820 if (NCH(n) == 1) {
1821 n = CHILD(n, 0);
1822 goto loop;
1823 }
1824 else {
1825 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001826 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001827 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001828 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 if (!ops)
1830 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001831 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 return NULL;
1834 }
1835 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001836 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001838 newoperator = ast_for_comp_op(c, CHILD(n, i));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001841 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842
1843 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001844 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001846 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 asdl_seq_SET(cmps, i / 2, expression);
1850 }
1851 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001852 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001854 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001856 return Compare(expression, ops, cmps, LINENO(n),
1857 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 }
1859 break;
1860
Guido van Rossum0368b722007-05-11 16:50:42 +00001861 case star_expr:
1862 if (TYPE(CHILD(n, 0)) == STAR) {
1863 return ast_for_starred(c, n);
1864 }
1865 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 /* The next five cases all handle BinOps. The main body of code
1867 is the same in each case, but the switch turned inside out to
1868 reuse the code for each type of operator.
1869 */
1870 case expr:
1871 case xor_expr:
1872 case and_expr:
1873 case shift_expr:
1874 case arith_expr:
1875 case term:
1876 if (NCH(n) == 1) {
1877 n = CHILD(n, 0);
1878 goto loop;
1879 }
1880 return ast_for_binop(c, n);
1881 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 expr_ty exp = NULL;
1883 if (NCH(n) == 2) {
1884 exp = ast_for_testlist(c, CHILD(n, 1));
1885 if (!exp)
1886 return NULL;
1887 }
1888 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1889 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001890 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891 if (NCH(n) == 1) {
1892 n = CHILD(n, 0);
1893 goto loop;
1894 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001895 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001896 case power:
1897 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001899 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 return NULL;
1901 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001902 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903 return NULL;
1904}
1905
1906static expr_ty
1907ast_for_call(struct compiling *c, const node *n, expr_ty func)
1908{
1909 /*
1910 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1911 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001912 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 */
1914
1915 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001916 asdl_seq *args;
1917 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918 expr_ty vararg = NULL, kwarg = NULL;
1919
1920 REQ(n, arglist);
1921
1922 nargs = 0;
1923 nkeywords = 0;
1924 ngens = 0;
1925 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001926 node *ch = CHILD(n, i);
1927 if (TYPE(ch) == argument) {
1928 if (NCH(ch) == 1)
1929 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001930 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001931 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001933 nkeywords++;
1934 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935 }
1936 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001937 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001938 "if not sole argument");
1939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 }
1941
1942 if (nargs + nkeywords + ngens > 255) {
1943 ast_error(n, "more than 255 arguments");
1944 return NULL;
1945 }
1946
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001947 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001949 return NULL;
1950 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001951 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001952 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 nargs = 0;
1954 nkeywords = 0;
1955 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001956 node *ch = CHILD(n, i);
1957 if (TYPE(ch) == argument) {
1958 expr_ty e;
1959 if (NCH(ch) == 1) {
1960 if (nkeywords) {
1961 ast_error(CHILD(ch, 0),
1962 "non-keyword arg after keyword arg");
1963 return NULL;
1964 }
Benjamin Peterson2d735bc2008-08-19 20:57:10 +00001965 if (vararg) {
1966 ast_error(CHILD(ch, 0),
1967 "only named arguments may follow *expression");
1968 return NULL;
1969 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001970 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001972 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001973 asdl_seq_SET(args, nargs++, e);
1974 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001975 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001979 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001981 else {
1982 keyword_ty kw;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00001983 identifier key, tmp;
1984 int k;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985
Thomas Wouters89f507f2006-12-13 04:49:30 +00001986 /* CHILD(ch, 0) is test, but must be an identifier? */
1987 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001989 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 /* f(lambda x: x[0] = 3) ends up getting parsed with
1991 * LHS test = lambda x: x[0], and RHS test = 3.
1992 * SF bug 132313 points out that complaining about a keyword
1993 * then is very confusing.
1994 */
1995 if (e->kind == Lambda_kind) {
1996 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001997 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001998 } else if (e->kind != Name_kind) {
1999 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002000 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00002001 } else if (forbidden_name(e, ch)) {
2002 return NULL;
2003 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002004 key = e->v.Name.id;
Benjamin Peterson07a1f942008-07-01 20:03:27 +00002005 for (k = 0; k < nkeywords; k++) {
2006 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
2007 if (!PyUnicode_Compare(tmp, key)) {
2008 ast_error(CHILD(ch, 0), "keyword argument repeated");
2009 return NULL;
2010 }
2011 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002014 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002015 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002016 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002017 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002018 asdl_seq_SET(keywords, nkeywords++, kw);
2019 }
2020 }
2021 else if (TYPE(ch) == STAR) {
2022 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002023 if (!vararg)
2024 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002025 i++;
2026 }
2027 else if (TYPE(ch) == DOUBLESTAR) {
2028 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002029 if (!kwarg)
2030 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 i++;
2032 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 }
2034
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002035 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036}
2037
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002039ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002041 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002042 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002043 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002045 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002046 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002047 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002048 }
2049 else {
2050 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002051 TYPE(n) == testlist1);
2052 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 else {
2056 asdl_seq *tmp = seq_for_testlist(c, n);
2057 if (!tmp)
2058 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002061}
2062
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063static stmt_ty
2064ast_for_expr_stmt(struct compiling *c, const node *n)
2065{
2066 REQ(n, expr_stmt);
2067 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2068 | ('=' (yield_expr|testlist))*)
2069 testlist: test (',' test)* [',']
2070 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002071 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 test: ... here starts the operator precendence dance
2073 */
2074
2075 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002076 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 if (!e)
2078 return NULL;
2079
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002081 }
2082 else if (TYPE(CHILD(n, 1)) == augassign) {
2083 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002084 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 if (!expr1)
2089 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002090 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002091 switch (expr1->kind) {
2092 case GeneratorExp_kind:
2093 ast_error(ch, "augmented assignment to generator "
2094 "expression not possible");
2095 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002096 case Yield_kind:
2097 ast_error(ch, "augmented assignment to yield "
2098 "expression not possible");
2099 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002100 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002101 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002102 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002103 break;
2104 }
2105 case Attribute_kind:
2106 case Subscript_kind:
2107 break;
2108 default:
2109 ast_error(ch, "illegal expression for augmented "
2110 "assignment");
2111 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002113 if(!set_context(c, expr1, Store, ch))
2114 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115
Thomas Wouters89f507f2006-12-13 04:49:30 +00002116 ch = CHILD(n, 2);
2117 if (TYPE(ch) == testlist)
2118 expr2 = ast_for_testlist(c, ch);
2119 else
2120 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002121 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122 return NULL;
2123
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002124 newoperator = ast_for_augassign(c, CHILD(n, 1));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126 return NULL;
2127
Thomas Wouters89f507f2006-12-13 04:49:30 +00002128 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 }
2130 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002131 int i;
2132 asdl_seq *targets;
2133 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 expr_ty expression;
2135
Thomas Wouters89f507f2006-12-13 04:49:30 +00002136 /* a normal assignment */
2137 REQ(CHILD(n, 1), EQUAL);
2138 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2139 if (!targets)
2140 return NULL;
2141 for (i = 0; i < NCH(n) - 2; i += 2) {
2142 expr_ty e;
2143 node *ch = CHILD(n, i);
2144 if (TYPE(ch) == yield_expr) {
2145 ast_error(ch, "assignment to yield expression not possible");
2146 return NULL;
2147 }
2148 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149
Thomas Wouters89f507f2006-12-13 04:49:30 +00002150 /* set context to assign */
2151 if (!e)
2152 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002154 if (!set_context(c, e, Store, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002155 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156
Thomas Wouters89f507f2006-12-13 04:49:30 +00002157 asdl_seq_SET(targets, i / 2, e);
2158 }
2159 value = CHILD(n, NCH(n) - 1);
2160 if (TYPE(value) == testlist)
2161 expression = ast_for_testlist(c, value);
2162 else
2163 expression = ast_for_expr(c, value);
2164 if (!expression)
2165 return NULL;
2166 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168}
2169
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002171ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002172{
2173 asdl_seq *seq;
2174 int i;
2175 expr_ty e;
2176
2177 REQ(n, exprlist);
2178
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002179 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002181 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002183 e = ast_for_expr(c, CHILD(n, i));
2184 if (!e)
2185 return NULL;
2186 asdl_seq_SET(seq, i / 2, e);
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002187 if (context && !set_context(c, e, context, CHILD(n, i)))
Thomas Wouters89f507f2006-12-13 04:49:30 +00002188 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 }
2190 return seq;
2191}
2192
2193static stmt_ty
2194ast_for_del_stmt(struct compiling *c, const node *n)
2195{
2196 asdl_seq *expr_list;
2197
2198 /* del_stmt: 'del' exprlist */
2199 REQ(n, del_stmt);
2200
2201 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2202 if (!expr_list)
2203 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002204 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205}
2206
2207static stmt_ty
2208ast_for_flow_stmt(struct compiling *c, const node *n)
2209{
2210 /*
2211 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2212 | yield_stmt
2213 break_stmt: 'break'
2214 continue_stmt: 'continue'
2215 return_stmt: 'return' [testlist]
2216 yield_stmt: yield_expr
2217 yield_expr: 'yield' testlist
2218 raise_stmt: 'raise' [test [',' test [',' test]]]
2219 */
2220 node *ch;
2221
2222 REQ(n, flow_stmt);
2223 ch = CHILD(n, 0);
2224 switch (TYPE(ch)) {
2225 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002226 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002228 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002230 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2231 if (!exp)
2232 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002233 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 }
2235 case return_stmt:
2236 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002237 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002239 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240 if (!expression)
2241 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002242 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243 }
2244 case raise_stmt:
2245 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002246 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2247 else if (NCH(ch) >= 2) {
2248 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002249 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2250 if (!expression)
2251 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002252 if (NCH(ch) == 4) {
2253 cause = ast_for_expr(c, CHILD(ch, 3));
2254 if (!cause)
2255 return NULL;
2256 }
2257 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 }
2259 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002260 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002261 "unexpected flow_stmt: %d", TYPE(ch));
2262 return NULL;
2263 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002264
2265 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2266 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267}
2268
2269static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002270alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271{
2272 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002273 import_as_name: NAME ['as' NAME]
2274 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002275 dotted_name: NAME ('.' NAME)*
2276 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002277 PyObject *str;
2278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 loop:
2280 switch (TYPE(n)) {
2281 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002282 str = NULL;
2283 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002284 str = NEW_IDENTIFIER(CHILD(n, 2));
2285 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002286 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002287 case dotted_as_name:
2288 if (NCH(n) == 1) {
2289 n = CHILD(n, 0);
2290 goto loop;
2291 }
2292 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002293 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002294 if (!a)
2295 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296 assert(!a->asname);
2297 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2298 return a;
2299 }
2300 break;
2301 case dotted_name:
2302 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002303 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304 else {
2305 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002306 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002307 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002308 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002309 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310
2311 len = 0;
2312 for (i = 0; i < NCH(n); i += 2)
2313 /* length of string plus one for the dot */
2314 len += strlen(STR(CHILD(n, i))) + 1;
2315 len--; /* the last name doesn't have a dot */
Christian Heimes72b710a2008-05-26 13:28:38 +00002316 str = PyBytes_FromStringAndSize(NULL, len);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002317 if (!str)
2318 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00002319 s = PyBytes_AS_STRING(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 if (!s)
2321 return NULL;
2322 for (i = 0; i < NCH(n); i += 2) {
2323 char *sch = STR(CHILD(n, i));
2324 strcpy(s, STR(CHILD(n, i)));
2325 s += strlen(sch);
2326 *s++ = '.';
2327 }
2328 --s;
2329 *s = '\0';
Christian Heimes72b710a2008-05-26 13:28:38 +00002330 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
2331 PyBytes_GET_SIZE(str),
Martin v. Löwis5b222132007-06-10 09:51:05 +00002332 NULL);
2333 Py_DECREF(str);
2334 if (!uni)
2335 return NULL;
2336 str = uni;
2337 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002338 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002339 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 }
2341 break;
2342 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002343 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002344 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002345 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002347 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 "unexpected import name: %d", TYPE(n));
2349 return NULL;
2350 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002351
2352 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 return NULL;
2354}
2355
2356static stmt_ty
2357ast_for_import_stmt(struct compiling *c, const node *n)
2358{
2359 /*
2360 import_stmt: import_name | import_from
2361 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002362 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2363 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002365 int lineno;
2366 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 int i;
2368 asdl_seq *aliases;
2369
2370 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002371 lineno = LINENO(n);
2372 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002374 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002375 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002376 REQ(n, dotted_as_names);
2377 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2378 if (!aliases)
2379 return NULL;
2380 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002381 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002382 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002384 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002385 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002386 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002387 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002388 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002390 int idx, ndots = 0;
2391 alias_ty mod = NULL;
2392 identifier modname;
2393
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002394 /* Count the number of dots (for relative imports) and check for the
2395 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002396 for (idx = 1; idx < NCH(n); idx++) {
2397 if (TYPE(CHILD(n, idx)) == dotted_name) {
2398 mod = alias_for_import_name(c, CHILD(n, idx));
2399 idx++;
2400 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002401 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2402 /* three consecutive dots are tokenized as one ELLIPSIS */
2403 ndots += 3;
2404 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002405 } else if (TYPE(CHILD(n, idx)) != DOT) {
2406 break;
2407 }
2408 ndots++;
2409 }
2410 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002411 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002412 case STAR:
2413 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 n = CHILD(n, idx);
2415 n_children = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002416 break;
2417 case LPAR:
2418 /* from ... import (x, y, z) */
2419 n = CHILD(n, idx + 1);
2420 n_children = NCH(n);
2421 break;
2422 case import_as_names:
2423 /* from ... import x, y, z */
2424 n = CHILD(n, idx);
2425 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002426 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 ast_error(n, "trailing comma not allowed without"
2428 " surrounding parentheses");
2429 return NULL;
2430 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002431 break;
2432 default:
2433 ast_error(n, "Unexpected node-type in from-import");
2434 return NULL;
2435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436
Thomas Wouters89f507f2006-12-13 04:49:30 +00002437 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2438 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440
2441 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002442 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002443 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002444 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002445 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002446 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002447 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002448 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002449 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002450 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2451 if (!import_alias)
2452 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002454 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002456 if (mod != NULL)
2457 modname = mod->name;
2458 else
2459 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002460 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002461 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 }
Neal Norwitz79792652005-11-14 04:25:03 +00002463 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 "unknown import statement: starts with command '%s'",
2465 STR(CHILD(n, 0)));
2466 return NULL;
2467}
2468
2469static stmt_ty
2470ast_for_global_stmt(struct compiling *c, const node *n)
2471{
2472 /* global_stmt: 'global' NAME (',' NAME)* */
2473 identifier name;
2474 asdl_seq *s;
2475 int i;
2476
2477 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002478 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002480 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002481 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002482 name = NEW_IDENTIFIER(CHILD(n, i));
2483 if (!name)
2484 return NULL;
2485 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002487 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002488}
2489
2490static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002491ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2492{
2493 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2494 identifier name;
2495 asdl_seq *s;
2496 int i;
2497
2498 REQ(n, nonlocal_stmt);
2499 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2500 if (!s)
2501 return NULL;
2502 for (i = 1; i < NCH(n); i += 2) {
2503 name = NEW_IDENTIFIER(CHILD(n, i));
2504 if (!name)
2505 return NULL;
2506 asdl_seq_SET(s, i / 2, name);
2507 }
2508 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2509}
2510
2511static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512ast_for_assert_stmt(struct compiling *c, const node *n)
2513{
2514 /* assert_stmt: 'assert' test [',' test] */
2515 REQ(n, assert_stmt);
2516 if (NCH(n) == 2) {
2517 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2518 if (!expression)
2519 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002520 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 }
2522 else if (NCH(n) == 4) {
2523 expr_ty expr1, expr2;
2524
2525 expr1 = ast_for_expr(c, CHILD(n, 1));
2526 if (!expr1)
2527 return NULL;
2528 expr2 = ast_for_expr(c, CHILD(n, 3));
2529 if (!expr2)
2530 return NULL;
2531
Thomas Wouters89f507f2006-12-13 04:49:30 +00002532 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 }
Neal Norwitz79792652005-11-14 04:25:03 +00002534 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535 "improper number of parts to 'assert' statement: %d",
2536 NCH(n));
2537 return NULL;
2538}
2539
2540static asdl_seq *
2541ast_for_suite(struct compiling *c, const node *n)
2542{
2543 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002544 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 stmt_ty s;
2546 int i, total, num, end, pos = 0;
2547 node *ch;
2548
2549 REQ(n, suite);
2550
2551 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002552 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002553 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002554 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002556 n = CHILD(n, 0);
2557 /* simple_stmt always ends with a NEWLINE,
2558 and may have a trailing SEMI
2559 */
2560 end = NCH(n) - 1;
2561 if (TYPE(CHILD(n, end - 1)) == SEMI)
2562 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002564 for (i = 0; i < end; i += 2) {
2565 ch = CHILD(n, i);
2566 s = ast_for_stmt(c, ch);
2567 if (!s)
2568 return NULL;
2569 asdl_seq_SET(seq, pos++, s);
2570 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 }
2572 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002573 for (i = 2; i < (NCH(n) - 1); i++) {
2574 ch = CHILD(n, i);
2575 REQ(ch, stmt);
2576 num = num_stmts(ch);
2577 if (num == 1) {
2578 /* small_stmt or compound_stmt with only one child */
2579 s = ast_for_stmt(c, ch);
2580 if (!s)
2581 return NULL;
2582 asdl_seq_SET(seq, pos++, s);
2583 }
2584 else {
2585 int j;
2586 ch = CHILD(ch, 0);
2587 REQ(ch, simple_stmt);
2588 for (j = 0; j < NCH(ch); j += 2) {
2589 /* statement terminates with a semi-colon ';' */
2590 if (NCH(CHILD(ch, j)) == 0) {
2591 assert((j + 1) == NCH(ch));
2592 break;
2593 }
2594 s = ast_for_stmt(c, CHILD(ch, j));
2595 if (!s)
2596 return NULL;
2597 asdl_seq_SET(seq, pos++, s);
2598 }
2599 }
2600 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 }
2602 assert(pos == seq->size);
2603 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604}
2605
2606static stmt_ty
2607ast_for_if_stmt(struct compiling *c, const node *n)
2608{
2609 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2610 ['else' ':' suite]
2611 */
2612 char *s;
2613
2614 REQ(n, if_stmt);
2615
2616 if (NCH(n) == 4) {
2617 expr_ty expression;
2618 asdl_seq *suite_seq;
2619
2620 expression = ast_for_expr(c, CHILD(n, 1));
2621 if (!expression)
2622 return NULL;
2623 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002624 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
2626
Guido van Rossumd8faa362007-04-27 19:54:29 +00002627 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2628 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002630
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631 s = STR(CHILD(n, 4));
2632 /* s[2], the third character in the string, will be
2633 's' for el_s_e, or
2634 'i' for el_i_f
2635 */
2636 if (s[2] == 's') {
2637 expr_ty expression;
2638 asdl_seq *seq1, *seq2;
2639
2640 expression = ast_for_expr(c, CHILD(n, 1));
2641 if (!expression)
2642 return NULL;
2643 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002644 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 return NULL;
2646 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002647 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 return NULL;
2649
Guido van Rossumd8faa362007-04-27 19:54:29 +00002650 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2651 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 }
2653 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002654 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002655 expr_ty expression;
2656 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002657 asdl_seq *orelse = NULL;
2658 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 /* must reference the child n_elif+1 since 'else' token is third,
2660 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002661 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2662 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2663 has_else = 1;
2664 n_elif -= 3;
2665 }
2666 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667
Thomas Wouters89f507f2006-12-13 04:49:30 +00002668 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002669 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670
Thomas Wouters89f507f2006-12-13 04:49:30 +00002671 orelse = asdl_seq_new(1, c->c_arena);
2672 if (!orelse)
2673 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002675 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2678 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2681 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683
Guido van Rossumd8faa362007-04-27 19:54:29 +00002684 asdl_seq_SET(orelse, 0,
2685 If(expression, suite_seq, suite_seq2,
2686 LINENO(CHILD(n, NCH(n) - 6)),
2687 CHILD(n, NCH(n) - 6)->n_col_offset,
2688 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002689 /* the just-created orelse handled the last elif */
2690 n_elif--;
2691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Thomas Wouters89f507f2006-12-13 04:49:30 +00002693 for (i = 0; i < n_elif; i++) {
2694 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002695 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2696 if (!newobj)
2697 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002698 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002699 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002702 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704
Thomas Wouters89f507f2006-12-13 04:49:30 +00002705 asdl_seq_SET(newobj, 0,
2706 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002707 LINENO(CHILD(n, off)),
2708 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002709 orelse = newobj;
2710 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002711 expression = ast_for_expr(c, CHILD(n, 1));
2712 if (!expression)
2713 return NULL;
2714 suite_seq = ast_for_suite(c, CHILD(n, 3));
2715 if (!suite_seq)
2716 return NULL;
2717 return If(expression, suite_seq, orelse,
2718 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002720
2721 PyErr_Format(PyExc_SystemError,
2722 "unexpected token in 'if' statement: %s", s);
2723 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724}
2725
2726static stmt_ty
2727ast_for_while_stmt(struct compiling *c, const node *n)
2728{
2729 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2730 REQ(n, while_stmt);
2731
2732 if (NCH(n) == 4) {
2733 expr_ty expression;
2734 asdl_seq *suite_seq;
2735
2736 expression = ast_for_expr(c, CHILD(n, 1));
2737 if (!expression)
2738 return NULL;
2739 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002740 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002742 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743 }
2744 else if (NCH(n) == 7) {
2745 expr_ty expression;
2746 asdl_seq *seq1, *seq2;
2747
2748 expression = ast_for_expr(c, CHILD(n, 1));
2749 if (!expression)
2750 return NULL;
2751 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002752 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753 return NULL;
2754 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002755 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 return NULL;
2757
Thomas Wouters89f507f2006-12-13 04:49:30 +00002758 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002760
2761 PyErr_Format(PyExc_SystemError,
2762 "wrong number of tokens for 'while' statement: %d",
2763 NCH(n));
2764 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765}
2766
2767static stmt_ty
2768ast_for_for_stmt(struct compiling *c, const node *n)
2769{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002770 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771 expr_ty expression;
2772 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002773 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2775 REQ(n, for_stmt);
2776
2777 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002778 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779 if (!seq)
2780 return NULL;
2781 }
2782
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002783 node_target = CHILD(n, 1);
2784 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002785 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002787 /* Check the # of children rather than the length of _target, since
2788 for x, in ... has 1 element in _target, but still requires a Tuple. */
2789 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002790 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002792 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002793
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002794 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002795 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 return NULL;
2797 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002798 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 return NULL;
2800
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002801 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2802 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803}
2804
2805static excepthandler_ty
2806ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2807{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002808 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002809 REQ(exc, except_clause);
2810 REQ(body, suite);
2811
2812 if (NCH(exc) == 1) {
2813 asdl_seq *suite_seq = ast_for_suite(c, body);
2814 if (!suite_seq)
2815 return NULL;
2816
Neal Norwitzad74aa82008-03-31 05:14:30 +00002817 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002818 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 }
2820 else if (NCH(exc) == 2) {
2821 expr_ty expression;
2822 asdl_seq *suite_seq;
2823
2824 expression = ast_for_expr(c, CHILD(exc, 1));
2825 if (!expression)
2826 return NULL;
2827 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002828 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829 return NULL;
2830
Neal Norwitzad74aa82008-03-31 05:14:30 +00002831 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002832 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002833 }
2834 else if (NCH(exc) == 4) {
2835 asdl_seq *suite_seq;
2836 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002837 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002838 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002841 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002842 return NULL;
2843 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002844 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845 return NULL;
2846
Neal Norwitzad74aa82008-03-31 05:14:30 +00002847 return ExceptHandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002848 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002850
2851 PyErr_Format(PyExc_SystemError,
2852 "wrong number of children for 'except' clause: %d",
2853 NCH(exc));
2854 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002855}
2856
2857static stmt_ty
2858ast_for_try_stmt(struct compiling *c, const node *n)
2859{
Neal Norwitzf599f422005-12-17 21:33:47 +00002860 const int nch = NCH(n);
2861 int n_except = (nch - 3)/3;
2862 asdl_seq *body, *orelse = NULL, *finally = NULL;
2863
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864 REQ(n, try_stmt);
2865
Neal Norwitzf599f422005-12-17 21:33:47 +00002866 body = ast_for_suite(c, CHILD(n, 2));
2867 if (body == NULL)
2868 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Neal Norwitzf599f422005-12-17 21:33:47 +00002870 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2871 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2872 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2873 /* we can assume it's an "else",
2874 because nch >= 9 for try-else-finally and
2875 it would otherwise have a type of except_clause */
2876 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2877 if (orelse == NULL)
2878 return NULL;
2879 n_except--;
2880 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002881
Neal Norwitzf599f422005-12-17 21:33:47 +00002882 finally = ast_for_suite(c, CHILD(n, nch - 1));
2883 if (finally == NULL)
2884 return NULL;
2885 n_except--;
2886 }
2887 else {
2888 /* we can assume it's an "else",
2889 otherwise it would have a type of except_clause */
2890 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2891 if (orelse == NULL)
2892 return NULL;
2893 n_except--;
2894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002896 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002897 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898 return NULL;
2899 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002900
2901 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002902 int i;
2903 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002904 /* process except statements to create a try ... except */
2905 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2906 if (handlers == NULL)
2907 return NULL;
2908
2909 for (i = 0; i < n_except; i++) {
2910 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2911 CHILD(n, 5 + i * 3));
2912 if (!e)
2913 return NULL;
2914 asdl_seq_SET(handlers, i, e);
2915 }
2916
Thomas Wouters89f507f2006-12-13 04:49:30 +00002917 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002918 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002919 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002920 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002921
2922 /* if a 'finally' is present too, we nest the TryExcept within a
2923 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002924 body = asdl_seq_new(1, c->c_arena);
2925 if (body == NULL)
2926 return NULL;
2927 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002928 }
2929
2930 /* must be a try ... finally (except clauses are in body, if any exist) */
2931 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002932 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933}
2934
Guido van Rossumc2e20742006-02-27 22:32:47 +00002935static expr_ty
2936ast_for_with_var(struct compiling *c, const node *n)
2937{
2938 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002939 return ast_for_expr(c, CHILD(n, 1));
2940}
2941
2942/* with_stmt: 'with' test [ with_var ] ':' suite */
2943static stmt_ty
2944ast_for_with_stmt(struct compiling *c, const node *n)
2945{
2946 expr_ty context_expr, optional_vars = NULL;
2947 int suite_index = 3; /* skip 'with', test, and ':' */
2948 asdl_seq *suite_seq;
2949
2950 assert(TYPE(n) == with_stmt);
2951 context_expr = ast_for_expr(c, CHILD(n, 1));
2952 if (TYPE(CHILD(n, 2)) == with_var) {
2953 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2954
2955 if (!optional_vars) {
2956 return NULL;
2957 }
Christian Heimes81ee3ef2008-05-04 22:42:01 +00002958 if (!set_context(c, optional_vars, Store, n)) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002959 return NULL;
2960 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002961 suite_index = 4;
2962 }
2963
2964 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2965 if (!suite_seq) {
2966 return NULL;
2967 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002968 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002969 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002970}
2971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002973ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002975 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2976 asdl_seq *s;
2977 expr_ty call, dummy;
2978
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 REQ(n, classdef);
2980
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002981 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 s = ast_for_suite(c, CHILD(n, 3));
2983 if (!s)
2984 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002985 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002986 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002988
2989 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002990 s = ast_for_suite(c, CHILD(n,5));
2991 if (!s)
2992 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002993 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002994 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 }
2996
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002997 /* class NAME '(' arglist ')' ':' suite */
2998 /* build up a fake Call node so we can extract its pieces */
2999 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
3000 call = ast_for_call(c, CHILD(n, 3), dummy);
3001 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00003004 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003006
3007 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
3008 call->v.Call.args, call->v.Call.keywords,
3009 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003010 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011}
3012
3013static stmt_ty
3014ast_for_stmt(struct compiling *c, const node *n)
3015{
3016 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003017 assert(NCH(n) == 1);
3018 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003019 }
3020 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00003021 assert(num_stmts(n) == 1);
3022 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 }
3024 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003025 REQ(n, small_stmt);
3026 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003027 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3028 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003029 */
3030 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 case expr_stmt:
3032 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003033 case del_stmt:
3034 return ast_for_del_stmt(c, n);
3035 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003036 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 case flow_stmt:
3038 return ast_for_flow_stmt(c, n);
3039 case import_stmt:
3040 return ast_for_import_stmt(c, n);
3041 case global_stmt:
3042 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003043 case nonlocal_stmt:
3044 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 case assert_stmt:
3046 return ast_for_assert_stmt(c, n);
3047 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003048 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003049 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3050 TYPE(n), NCH(n));
3051 return NULL;
3052 }
3053 }
3054 else {
3055 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003056 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003057 */
3058 node *ch = CHILD(n, 0);
3059 REQ(n, compound_stmt);
3060 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061 case if_stmt:
3062 return ast_for_if_stmt(c, ch);
3063 case while_stmt:
3064 return ast_for_while_stmt(c, ch);
3065 case for_stmt:
3066 return ast_for_for_stmt(c, ch);
3067 case try_stmt:
3068 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003069 case with_stmt:
3070 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003072 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003073 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003074 return ast_for_classdef(c, ch, NULL);
3075 case decorated:
3076 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003078 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003079 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3080 TYPE(n), NCH(n));
3081 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003082 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083 }
3084}
3085
3086static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003087parsenumber(struct compiling *c, const char *s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003089 const char *end;
3090 long x;
3091 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092#ifndef WITHOUT_COMPLEX
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003093 Py_complex compl;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003094 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095#endif
3096
Guido van Rossumd8faa362007-04-27 19:54:29 +00003097 errno = 0;
3098 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003100 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003101#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003102 if (s[0] == '0') {
3103 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3104 if (x < 0 && errno == 0) {
3105 return PyLong_FromString((char *)s,
3106 (char **)0,
3107 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003108 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003109 }
3110 else
3111 x = PyOS_strtol((char *)s, (char **)&end, 0);
3112 if (*end == '\0') {
3113 if (errno != 0)
3114 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003115 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 }
3117 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003119 if (imflag) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003120 compl.real = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003121 PyFPE_START_PROTECT("atof", return 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003122 compl.imag = PyOS_ascii_atof(s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003123 PyFPE_END_PROTECT(c)
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003124 return PyComplex_FromCComplex(compl);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003125 }
3126 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003128 {
3129 PyFPE_START_PROTECT("atof", return 0)
3130 dx = PyOS_ascii_atof(s);
3131 PyFPE_END_PROTECT(dx)
3132 return PyFloat_FromDouble(dx);
3133 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134}
3135
3136static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003137decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003139 PyObject *u, *v;
3140 char *s, *t;
3141 t = s = (char *)*sPtr;
3142 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3143 while (s < end && (*s & 0x80)) s++;
3144 *sPtr = s;
3145 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3146 if (u == NULL)
3147 return NULL;
3148 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3149 Py_DECREF(u);
3150 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003151}
3152
3153static PyObject *
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003154decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003156 PyObject *v, *u;
3157 char *buf;
3158 char *p;
3159 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003160
Guido van Rossumd8faa362007-04-27 19:54:29 +00003161 if (encoding == NULL) {
3162 buf = (char *)s;
3163 u = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003164 } else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00003165 /* check for integer overflow */
3166 if (len > PY_SIZE_MAX / 4)
3167 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003168 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
Christian Heimes72b710a2008-05-26 13:28:38 +00003169 u = PyBytes_FromStringAndSize((char *)NULL, len * 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 if (u == NULL)
3171 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +00003172 p = buf = PyBytes_AsString(u);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003173 end = s + len;
3174 while (s < end) {
3175 if (*s == '\\') {
3176 *p++ = *s++;
3177 if (*s & 0x80) {
3178 strcpy(p, "u005c");
3179 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003180 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003181 }
3182 if (*s & 0x80) { /* XXX inefficient */
3183 PyObject *w;
3184 char *r;
3185 Py_ssize_t rn, i;
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003186 w = decode_utf8(c, &s, end, "utf-16-be");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003187 if (w == NULL) {
3188 Py_DECREF(u);
3189 return NULL;
3190 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003191 r = PyBytes_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003192 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003193 assert(rn % 2 == 0);
3194 for (i = 0; i < rn; i += 2) {
3195 sprintf(p, "\\u%02x%02x",
3196 r[i + 0] & 0xFF,
3197 r[i + 1] & 0xFF);
3198 p += 6;
3199 }
3200 Py_DECREF(w);
3201 } else {
3202 *p++ = *s++;
3203 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003204 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003205 len = p - buf;
3206 s = buf;
3207 }
3208 if (rawmode)
3209 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3210 else
3211 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3212 Py_XDECREF(u);
3213 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003214}
3215
3216/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003217 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003218 * parsestr parses it, and returns the decoded Python string object.
3219 */
3220static PyObject *
Christian Heimes4d6ec852008-03-26 22:34:47 +00003221parsestr(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003223 size_t len;
3224 const char *s = STR(n);
3225 int quote = Py_CHARMASK(*s);
3226 int rawmode = 0;
3227 int need_encoding;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003228 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003229 if (quote == 'b' || quote == 'B') {
3230 quote = *++s;
3231 *bytesmode = 1;
3232 }
3233 if (quote == 'r' || quote == 'R') {
3234 quote = *++s;
3235 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003236 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003237 }
3238 if (quote != '\'' && quote != '\"') {
3239 PyErr_BadInternalCall();
3240 return NULL;
3241 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 s++;
3243 len = strlen(s);
3244 if (len > INT_MAX) {
3245 PyErr_SetString(PyExc_OverflowError,
3246 "string to parse is too long");
3247 return NULL;
3248 }
3249 if (s[--len] != quote) {
3250 PyErr_BadInternalCall();
3251 return NULL;
3252 }
3253 if (len >= 4 && s[0] == quote && s[1] == quote) {
3254 s += 2;
3255 len -= 2;
3256 if (s[--len] != quote || s[--len] != quote) {
3257 PyErr_BadInternalCall();
3258 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003259 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003260 }
Benjamin Peterson8dbca062008-04-05 14:49:54 +00003261 if (!*bytesmode && !rawmode) {
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003262 return decode_unicode(c, s, len, rawmode, c->c_encoding);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003263 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003264 if (*bytesmode) {
3265 /* Disallow non-ascii characters (but not escapes) */
3266 const char *c;
3267 for (c = s; *c; c++) {
3268 if (Py_CHARMASK(*c) >= 0x80) {
3269 ast_error(n, "bytes can only contain ASCII "
3270 "literal characters.");
3271 return NULL;
3272 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003273 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003274 }
Christian Heimes4d6ec852008-03-26 22:34:47 +00003275 need_encoding = (!*bytesmode && c->c_encoding != NULL &&
Brett Cannonda780432008-10-17 03:38:50 +00003276 strcmp(c->c_encoding, "utf-8") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003277 if (rawmode || strchr(s, '\\') == NULL) {
3278 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003279 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003280 if (u == NULL || !*bytesmode)
3281 return u;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003282 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003283 Py_DECREF(u);
3284 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003285 } else if (*bytesmode) {
Christian Heimes72b710a2008-05-26 13:28:38 +00003286 return PyBytes_FromStringAndSize(s, len);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003287 } else if (strcmp(c->c_encoding, "utf-8") == 0) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003288 return PyUnicode_FromStringAndSize(s, len);
3289 } else {
3290 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003291 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003292 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003293 return PyBytes_DecodeEscape(s, len, NULL, 1,
Christian Heimes4d6ec852008-03-26 22:34:47 +00003294 need_encoding ? c->c_encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295}
3296
Guido van Rossum29fd7122007-11-12 01:13:56 +00003297/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 * compile-time literal catenation, calling parsestr() on each piece, and
3299 * pasting the intermediate results together.
3300 */
3301static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003302parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003304 PyObject *v;
3305 int i;
3306 REQ(CHILD(n, 0), STRING);
Christian Heimes4d6ec852008-03-26 22:34:47 +00003307 v = parsestr(c, CHILD(n, 0), bytesmode);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003308 if (v != NULL) {
3309 /* String literal concatenation */
3310 for (i = 1; i < NCH(n); i++) {
3311 PyObject *s;
3312 int subbm = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00003313 s = parsestr(c, CHILD(n, i), &subbm);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 if (s == NULL)
3315 goto onError;
3316 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003317 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003318 goto onError;
3319 }
Christian Heimes72b710a2008-05-26 13:28:38 +00003320 if (PyBytes_Check(v) && PyBytes_Check(s)) {
3321 PyBytes_ConcatAndDel(&v, s);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003322 if (v == NULL)
3323 goto onError;
3324 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003325 else {
3326 PyObject *temp = PyUnicode_Concat(v, s);
3327 Py_DECREF(s);
3328 Py_DECREF(v);
3329 v = temp;
3330 if (v == NULL)
3331 goto onError;
3332 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003333 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003334 }
3335 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336
Guido van Rossumd8faa362007-04-27 19:54:29 +00003337 onError:
3338 Py_XDECREF(v);
3339 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340}