blob: d5d84f74b8b27d2cdf9f2dc37d933d8b8b478cdf [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
37static PyObject *parsenumber(const char *);
Thomas Wouters00e41de2007-02-23 19:56:57 +000038static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
39static PyObject *parsestrplus(struct compiling *, const node *n,
40 int *bytesmode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000041
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042#ifndef LINENO
Thomas Wouters89f507f2006-12-13 04:49:30 +000043#define LINENO(n) ((n)->n_lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044#endif
45
Nick Coghlan650f0d02007-04-15 12:05:43 +000046#define COMP_GENEXP 0
47#define COMP_LISTCOMP 1
48#define COMP_SETCOMP 2
49
Neal Norwitzadb69fc2005-12-17 20:54:49 +000050static identifier
Martin v. Löwis47383402007-08-15 07:32:56 +000051new_identifier(const char* n, PyArena *arena)
52{
Martin v. Löwis5b222132007-06-10 09:51:05 +000053 PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
Martin v. Löwis47383402007-08-15 07:32:56 +000054 Py_UNICODE *u = PyUnicode_AS_UNICODE(id);
55 /* Check whether there are non-ASCII characters in the
56 identifier; if so, normalize to NFKC. */
57 for (; *u; u++) {
58 if (*u >= 128) {
Christian Heimes819b8bf2008-01-03 23:05:47 +000059 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
Martin v. Löwis47383402007-08-15 07:32:56 +000060 PyObject *id2;
61 if (!m)
62 return NULL;
63 id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
64 Py_DECREF(m);
65 if (!id2)
66 return NULL;
67 Py_DECREF(id);
68 id = id2;
69 break;
70 }
71 }
Martin v. Löwis5b222132007-06-10 09:51:05 +000072 PyUnicode_InternInPlace(&id);
Neal Norwitzadb69fc2005-12-17 20:54:49 +000073 PyArena_AddPyObject(arena, id);
74 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075}
76
Neal Norwitzadb69fc2005-12-17 20:54:49 +000077#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078
79/* This routine provides an invalid object for the syntax error.
80 The outermost routine must unpack this error and create the
81 proper object. We do this so that we don't have to pass
82 the filename to everything function.
83
84 XXX Maybe we should just pass the filename...
85*/
86
87static int
88ast_error(const node *n, const char *errstr)
89{
90 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
91 if (!u)
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093 PyErr_SetObject(PyExc_SyntaxError, u);
94 Py_DECREF(u);
95 return 0;
96}
97
98static void
99ast_error_finish(const char *filename)
100{
101 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000102 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103
104 assert(PyErr_Occurred());
105 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000106 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107
108 PyErr_Fetch(&type, &value, &tback);
109 errstr = PyTuple_GetItem(value, 0);
110 if (!errstr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000111 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112 Py_INCREF(errstr);
Christian Heimes217cfd12007-12-02 14:31:20 +0000113 lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000114 if (lineno == -1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000115 Py_DECREF(errstr);
116 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000117 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118 Py_DECREF(value);
119
120 loc = PyErr_ProgramText(filename, lineno);
121 if (!loc) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000122 Py_INCREF(Py_None);
123 loc = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000125 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000127 if (!tmp) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000128 Py_DECREF(errstr);
129 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000131 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132 Py_DECREF(errstr);
133 Py_DECREF(tmp);
134 if (!value)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000135 return;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136 PyErr_Restore(type, value, tback);
137}
138
139/* num_stmts() returns number of contained statements.
140
141 Use this routine to determine how big a sequence is needed for
142 the statements in a parse tree. Its raison d'etre is this bit of
143 grammar:
144
145 stmt: simple_stmt | compound_stmt
146 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
147
148 A simple_stmt can contain multiple small_stmt elements joined
149 by semicolons. If the arg is a simple_stmt, the number of
150 small_stmt elements is returned.
151*/
152
153static int
154num_stmts(const node *n)
155{
156 int i, l;
157 node *ch;
158
159 switch (TYPE(n)) {
160 case single_input:
161 if (TYPE(CHILD(n, 0)) == NEWLINE)
162 return 0;
163 else
164 return num_stmts(CHILD(n, 0));
165 case file_input:
166 l = 0;
167 for (i = 0; i < NCH(n); i++) {
168 ch = CHILD(n, i);
169 if (TYPE(ch) == stmt)
170 l += num_stmts(ch);
171 }
172 return l;
173 case stmt:
174 return num_stmts(CHILD(n, 0));
175 case compound_stmt:
176 return 1;
177 case simple_stmt:
178 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
179 case suite:
180 if (NCH(n) == 1)
181 return num_stmts(CHILD(n, 0));
182 else {
183 l = 0;
184 for (i = 2; i < (NCH(n) - 1); i++)
185 l += num_stmts(CHILD(n, i));
186 return l;
187 }
188 default: {
189 char buf[128];
190
191 sprintf(buf, "Non-statement found: %d %d\n",
192 TYPE(n), NCH(n));
193 Py_FatalError(buf);
194 }
195 }
196 assert(0);
197 return 0;
198}
199
200/* Transform the CST rooted at node * to the appropriate AST
201*/
202
203mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
205 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000207 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000208 asdl_seq *stmts = NULL;
209 stmt_ty s;
210 node *ch;
211 struct compiling c;
212
213 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000214 c.c_encoding = "utf-8";
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000215 if (TYPE(n) == encoding_decl) {
Guido van Rossum53970392007-06-12 00:28:30 +0000216#if 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 ast_error(n, "encoding declaration in Unicode string");
218 goto error;
Guido van Rossum53970392007-06-12 00:28:30 +0000219#endif
220 n = CHILD(n, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 } else if (TYPE(n) == encoding_decl) {
223 c.c_encoding = STR(n);
224 n = CHILD(n, 0);
225 } else {
Martin v. Löwis447d33e2007-07-29 18:10:01 +0000226 /* PEP 3120 */
227 c.c_encoding = "utf-8";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000229 c.c_arena = arena;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000230 c.c_filename = filename;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231
Jeremy Hyltona8293132006-02-28 17:58:27 +0000232 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 switch (TYPE(n)) {
234 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 if (!stmts)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000238 for (i = 0; i < NCH(n) - 1; i++) {
239 ch = CHILD(n, i);
240 if (TYPE(ch) == NEWLINE)
241 continue;
242 REQ(ch, stmt);
243 num = num_stmts(ch);
244 if (num == 1) {
245 s = ast_for_stmt(&c, ch);
246 if (!s)
247 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000248 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249 }
250 else {
251 ch = CHILD(ch, 0);
252 REQ(ch, simple_stmt);
253 for (j = 0; j < num; j++) {
254 s = ast_for_stmt(&c, CHILD(ch, j * 2));
255 if (!s)
256 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000257 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 }
259 }
260 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000261 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 case eval_input: {
263 expr_ty testlist_ast;
264
Nick Coghlan650f0d02007-04-15 12:05:43 +0000265 /* XXX Why not comp_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000266 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 if (!testlist_ast)
268 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000269 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 }
271 case single_input:
272 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000273 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000274 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000275 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000276 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
277 arena));
Guido van Rossum360e4b82007-05-14 22:51:27 +0000278 if (!asdl_seq_GET(stmts, 0))
279 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000280 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281 }
282 else {
283 n = CHILD(n, 0);
284 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000285 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286 if (!stmts)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288 if (num == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000289 s = ast_for_stmt(&c, n);
290 if (!s)
291 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 asdl_seq_SET(stmts, 0, s);
293 }
294 else {
295 /* Only a simple_stmt can contain multiple statements. */
296 REQ(n, simple_stmt);
297 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298 if (TYPE(CHILD(n, i)) == NEWLINE)
299 break;
300 s = ast_for_stmt(&c, CHILD(n, i));
301 if (!s)
302 goto error;
303 asdl_seq_SET(stmts, i / 2, s);
304 }
305 }
306
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000307 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308 }
309 default:
Guido van Rossum360e4b82007-05-14 22:51:27 +0000310 PyErr_Format(PyExc_SystemError,
311 "invalid node %d for PyAST_FromNode", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312 goto error;
313 }
314 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315 ast_error_finish(filename);
316 return NULL;
317}
318
319/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
320*/
321
322static operator_ty
323get_operator(const node *n)
324{
325 switch (TYPE(n)) {
326 case VBAR:
327 return BitOr;
328 case CIRCUMFLEX:
329 return BitXor;
330 case AMPER:
331 return BitAnd;
332 case LEFTSHIFT:
333 return LShift;
334 case RIGHTSHIFT:
335 return RShift;
336 case PLUS:
337 return Add;
338 case MINUS:
339 return Sub;
340 case STAR:
341 return Mult;
342 case SLASH:
343 return Div;
344 case DOUBLESLASH:
345 return FloorDiv;
346 case PERCENT:
347 return Mod;
348 default:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000349 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000350 }
351}
352
Guido van Rossume7ba4952007-06-06 23:52:48 +0000353static const char* FORBIDDEN[] = {
354 "None",
355 "True",
356 "False",
357 NULL,
358};
359
360static int
361forbidden_name(expr_ty e, const node *n)
362{
Guido van Rossume7ba4952007-06-06 23:52:48 +0000363 const char **p;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000364 assert(PyUnicode_Check(e->v.Name.id));
Guido van Rossume7ba4952007-06-06 23:52:48 +0000365 for (p = FORBIDDEN; *p; p++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000366 if (PyUnicode_CompareWithASCIIString(e->v.Name.id, *p) == 0) {
Guido van Rossume7ba4952007-06-06 23:52:48 +0000367 ast_error(n, "assignment to keyword");
368 return 1;
369 }
370 }
371 return 0;
372}
373
Jeremy Hyltona8293132006-02-28 17:58:27 +0000374/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
376 Only sets context for expr kinds that "can appear in assignment context"
377 (according to ../Parser/Python.asdl). For other expr kinds, it sets
378 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379*/
380
381static int
382set_context(expr_ty e, expr_context_ty ctx, const node *n)
383{
384 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000385 /* If a particular expression type can't be used for assign / delete,
386 set expr_name to its name and an error message will be generated.
387 */
388 const char* expr_name = NULL;
389
390 /* The ast defines augmented store and load contexts, but the
391 implementation here doesn't actually use them. The code may be
392 a little more complex than necessary as a result. It also means
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000394 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000395 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000396 */
397 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
399 switch (e->kind) {
400 case Attribute_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 e->v.Attribute.ctx = ctx;
402 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403 case Subscript_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 e->v.Subscript.ctx = ctx;
405 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000406 case Starred_kind:
407 e->v.Starred.ctx = ctx;
408 if (!set_context(e->v.Starred.value, ctx, n))
409 return 0;
410 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411 case Name_kind:
Guido van Rossume7ba4952007-06-06 23:52:48 +0000412 if (ctx == Store) {
413 if (forbidden_name(e, n))
414 return 0; /* forbidden_name() calls ast_error() */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000415 }
416 e->v.Name.ctx = ctx;
417 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418 case List_kind:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000419 e->v.List.ctx = ctx;
420 s = e->v.List.elts;
421 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422 case Tuple_kind:
423 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
424 return ast_error(n, "can't assign to ()");
Thomas Wouters89f507f2006-12-13 04:49:30 +0000425 e->v.Tuple.ctx = ctx;
426 s = e->v.Tuple.elts;
427 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000428 case Lambda_kind:
429 expr_name = "lambda";
430 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000432 expr_name = "function call";
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000434 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000436 case UnaryOp_kind:
437 expr_name = "operator";
438 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000440 expr_name = "generator expression";
441 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442 case Yield_kind:
443 expr_name = "yield expression";
444 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000445 case ListComp_kind:
446 expr_name = "list comprehension";
447 break;
Guido van Rossum0368b722007-05-11 16:50:42 +0000448 case SetComp_kind:
449 expr_name = "set comprehension";
450 break;
Guido van Rossum992d4a32007-07-11 13:09:30 +0000451 case DictComp_kind:
452 expr_name = "dict comprehension";
453 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000454 case Dict_kind:
Neal Norwitzc1505362006-12-28 06:47:50 +0000455 case Set_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456 case Num_kind:
457 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000458 expr_name = "literal";
459 break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000460 case Ellipsis_kind:
461 expr_name = "Ellipsis";
462 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000463 case Compare_kind:
464 expr_name = "comparison";
465 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 case IfExp_kind:
467 expr_name = "conditional expression";
468 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000469 default:
470 PyErr_Format(PyExc_SystemError,
471 "unexpected expression in assignment %d (line %d)",
472 e->kind, e->lineno);
473 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000475 /* Check for error string set by switch */
476 if (expr_name) {
477 char buf[300];
478 PyOS_snprintf(buf, sizeof(buf),
479 "can't %s %s",
480 ctx == Store ? "assign to" : "delete",
481 expr_name);
482 return ast_error(n, buf);
483 }
484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000486 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487 */
488 if (s) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
Thomas Wouters89f507f2006-12-13 04:49:30 +0000491 for (i = 0; i < asdl_seq_LEN(s); i++) {
492 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
493 return 0;
494 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 }
496 return 1;
497}
498
499static operator_ty
500ast_for_augassign(const node *n)
501{
502 REQ(n, augassign);
503 n = CHILD(n, 0);
504 switch (STR(n)[0]) {
505 case '+':
506 return Add;
507 case '-':
508 return Sub;
509 case '/':
510 if (STR(n)[1] == '/')
511 return FloorDiv;
512 else
513 return Div;
514 case '%':
515 return Mod;
516 case '<':
517 return LShift;
518 case '>':
519 return RShift;
520 case '&':
521 return BitAnd;
522 case '^':
523 return BitXor;
524 case '|':
525 return BitOr;
526 case '*':
527 if (STR(n)[1] == '*')
528 return Pow;
529 else
530 return Mult;
531 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000532 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000533 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534 }
535}
536
537static cmpop_ty
538ast_for_comp_op(const node *n)
539{
Guido van Rossumb053cd82006-08-24 03:53:23 +0000540 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541 |'is' 'not'
542 */
543 REQ(n, comp_op);
544 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000545 n = CHILD(n, 0);
546 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547 case LESS:
548 return Lt;
549 case GREATER:
550 return Gt;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000551 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return Eq;
553 case LESSEQUAL:
554 return LtE;
555 case GREATEREQUAL:
556 return GtE;
557 case NOTEQUAL:
558 return NotEq;
559 case NAME:
560 if (strcmp(STR(n), "in") == 0)
561 return In;
562 if (strcmp(STR(n), "is") == 0)
563 return Is;
564 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000565 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 STR(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569 }
570 else if (NCH(n) == 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000571 /* handle "not in" and "is not" */
572 switch (TYPE(CHILD(n, 0))) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573 case NAME:
574 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
575 return NotIn;
576 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
577 return IsNot;
578 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000579 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000580 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 return (cmpop_ty)0;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000582 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583 }
Neal Norwitz79792652005-11-14 04:25:03 +0000584 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000585 NCH(n));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000587}
588
589static asdl_seq *
590seq_for_testlist(struct compiling *c, const node *n)
591{
592 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000593 asdl_seq *seq;
594 expr_ty expression;
595 int i;
Nick Coghlan650f0d02007-04-15 12:05:43 +0000596 assert(TYPE(n) == testlist || TYPE(n) == testlist_comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000597
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000598 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599 if (!seq)
600 return NULL;
601
602 for (i = 0; i < NCH(n); i += 2) {
Nick Coghlan650f0d02007-04-15 12:05:43 +0000603 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == test_nocond);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604
605 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000606 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
609 assert(i / 2 < seq->size);
610 asdl_seq_SET(seq, i / 2, expression);
611 }
612 return seq;
613}
614
Neal Norwitzc1505362006-12-28 06:47:50 +0000615static arg_ty
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000616compiler_arg(struct compiling *c, const node *n)
Neal Norwitzc1505362006-12-28 06:47:50 +0000617{
618 identifier name;
619 expr_ty annotation = NULL;
620 node *ch;
621
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000622 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000623 ch = CHILD(n, 0);
Neal Norwitzc1505362006-12-28 06:47:50 +0000624 name = NEW_IDENTIFIER(ch);
625 if (!name)
626 return NULL;
627
628 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
629 annotation = ast_for_expr(c, CHILD(n, 2));
630 if (!annotation)
631 return NULL;
632 }
633
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000634 return arg(name, annotation, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635}
636
Guido van Rossum4f72a782006-10-27 23:31:49 +0000637/* returns -1 if failed to handle keyword only arguments
638 returns new position to keep processing if successful
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000639 (',' tfpdef ['=' test])*
Guido van Rossum4f72a782006-10-27 23:31:49 +0000640 ^^^
641 start pointing here
642 */
643static int
644handle_keywordonly_args(struct compiling *c, const node *n, int start,
645 asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
646{
647 node *ch;
Neal Norwitzc1505362006-12-28 06:47:50 +0000648 expr_ty expression, annotation;
649 arg_ty arg;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000650 int i = start;
651 int j = 0; /* index for kwdefaults and kwonlyargs */
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000652
653 if (kwonlyargs == NULL) {
654 ast_error(CHILD(n, start), "named arguments must follow bare *");
655 return -1;
656 }
657 assert(kwdefaults != NULL);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000658 while (i < NCH(n)) {
659 ch = CHILD(n, i);
660 switch (TYPE(ch)) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000661 case vfpdef:
662 case tfpdef:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000663 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000664 expression = ast_for_expr(c, CHILD(n, i + 2));
Guido van Rossum4f72a782006-10-27 23:31:49 +0000665 asdl_seq_SET(kwdefaults, j, expression);
666 i += 2; /* '=' and test */
667 }
668 else { /* setting NULL if no default value exists */
669 asdl_seq_SET(kwdefaults, j, NULL);
670 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000671 if (NCH(ch) == 3) {
672 /* ch is NAME ':' test */
673 annotation = ast_for_expr(c, CHILD(ch, 2));
674 if (!annotation) {
675 ast_error(ch, "expected expression");
676 goto error;
677 }
678 }
679 else {
680 annotation = NULL;
681 }
682 ch = CHILD(ch, 0);
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000683 arg = arg(NEW_IDENTIFIER(ch), annotation, c->c_arena);
Neal Norwitzc1505362006-12-28 06:47:50 +0000684 if (!arg) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000685 ast_error(ch, "expecting name");
686 goto error;
687 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000688 asdl_seq_SET(kwonlyargs, j++, arg);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000689 i += 2; /* the name and the comma */
690 break;
691 case DOUBLESTAR:
692 return i;
693 default:
694 ast_error(ch, "unexpected node");
695 goto error;
696 }
697 }
698 return i;
699 error:
700 return -1;
701}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702
Jeremy Hyltona8293132006-02-28 17:58:27 +0000703/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704
705static arguments_ty
706ast_for_arguments(struct compiling *c, const node *n)
707{
Neal Norwitzc1505362006-12-28 06:47:50 +0000708 /* This function handles both typedargslist (function definition)
709 and varargslist (lambda definition).
710
711 parameters: '(' [typedargslist] ')'
712 typedargslist: ((tfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000713 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef]
714 | '**' tfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000715 | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000716 tfpdef: NAME [':' test]
Neal Norwitzc1505362006-12-28 06:47:50 +0000717 varargslist: ((vfpdef ['=' test] ',')*
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000718 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef]
719 | '**' vfpdef)
Neal Norwitzc1505362006-12-28 06:47:50 +0000720 | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000721 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 */
Guido van Rossum4f72a782006-10-27 23:31:49 +0000723 int i, j, k, nposargs = 0, nkwonlyargs = 0;
724 int nposdefaults = 0, found_default = 0;
725 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726 identifier vararg = NULL, kwarg = NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000727 arg_ty arg;
728 expr_ty varargannotation = NULL, kwargannotation = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 node *ch;
730
731 if (TYPE(n) == parameters) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000732 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzc1505362006-12-28 06:47:50 +0000733 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
734 NULL, c->c_arena);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000735 n = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000736 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000737 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738
Guido van Rossum4f72a782006-10-27 23:31:49 +0000739 /* first count the number of positional args & defaults */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000740 for (i = 0; i < NCH(n); i++) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000741 ch = CHILD(n, i);
742 if (TYPE(ch) == STAR) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000743 /* skip star and possible argument */
744 i++;
745 i += (TYPE(CHILD(n, i)) == tfpdef
746 || TYPE(CHILD(n, i)) == vfpdef);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000747 break;
748 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000749 if (TYPE(ch) == DOUBLESTAR) break;
Neal Norwitzc1505362006-12-28 06:47:50 +0000750 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000751 if (TYPE(ch) == EQUAL) nposdefaults++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000753 /* count the number of keyword only args &
754 defaults for keyword only args */
755 for ( ; i < NCH(n); ++i) {
756 ch = CHILD(n, i);
757 if (TYPE(ch) == DOUBLESTAR) break;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000758 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000759 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000760 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL);
761 if (!posargs && nposargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000762 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000763 kwonlyargs = (nkwonlyargs ?
764 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
765 if (!kwonlyargs && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000766 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000767 posdefaults = (nposdefaults ?
768 asdl_seq_new(nposdefaults, c->c_arena) : NULL);
769 if (!posdefaults && nposdefaults)
Neal Norwitzc1505362006-12-28 06:47:50 +0000770 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000771 /* The length of kwonlyargs and kwdefaults are same
772 since we set NULL as default for keyword only argument w/o default
773 - we have sequence data structure, but no dictionary */
Neal Norwitzc1505362006-12-28 06:47:50 +0000774 kwdefaults = (nkwonlyargs ?
Guido van Rossum4f72a782006-10-27 23:31:49 +0000775 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
776 if (!kwdefaults && nkwonlyargs)
Neal Norwitzc1505362006-12-28 06:47:50 +0000777 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000778
779 if (nposargs + nkwonlyargs > 255) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000780 ast_error(n, "more than 255 arguments");
781 return NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000782 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000784 /* tfpdef: NAME [':' test]
785 vfpdef: NAME
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786 */
787 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000788 j = 0; /* index for defaults */
789 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790 while (i < NCH(n)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000791 ch = CHILD(n, i);
792 switch (TYPE(ch)) {
Neal Norwitzc1505362006-12-28 06:47:50 +0000793 case tfpdef:
794 case vfpdef:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
796 anything other than EQUAL or a comma? */
797 /* XXX Should NCH(n) check be made a separate check? */
798 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000799 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
800 if (!expression)
Guido van Rossum4f72a782006-10-27 23:31:49 +0000801 goto error;
802 assert(posdefaults != NULL);
803 asdl_seq_SET(posdefaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804 i += 2;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000805 found_default = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000806 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000807 else if (found_default) {
808 ast_error(n,
809 "non-default argument follows default argument");
810 goto error;
811 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000812 arg = compiler_arg(c, ch);
Neal Norwitzc1505362006-12-28 06:47:50 +0000813 if (!arg)
814 goto error;
815 asdl_seq_SET(posargs, k++, arg);
816
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000817 i += 2; /* the name and the comma */
818 break;
819 case STAR:
Guido van Rossum4f72a782006-10-27 23:31:49 +0000820 if (i+1 >= NCH(n)) {
Amaury Forgeot d'Arc40d3a672007-12-09 21:49:48 +0000821 ast_error(CHILD(n, i),
822 "named arguments must follow bare *");
Neal Norwitzc1505362006-12-28 06:47:50 +0000823 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000824 }
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000825 ch = CHILD(n, i+1); /* tfpdef or COMMA */
Neal Norwitzc1505362006-12-28 06:47:50 +0000826 if (TYPE(ch) == COMMA) {
827 int res = 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000828 i += 2; /* now follows keyword only arguments */
829 res = handle_keywordonly_args(c, n, i,
830 kwonlyargs, kwdefaults);
831 if (res == -1) goto error;
832 i = res; /* res has new position to process */
833 }
834 else {
Neal Norwitzc1505362006-12-28 06:47:50 +0000835 vararg = NEW_IDENTIFIER(CHILD(ch, 0));
836 if (NCH(ch) > 1) {
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000837 /* there is an annotation on the vararg */
838 varargannotation = ast_for_expr(c, CHILD(ch, 2));
Neal Norwitzc1505362006-12-28 06:47:50 +0000839 }
Guido van Rossum4f72a782006-10-27 23:31:49 +0000840 i += 3;
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000841 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
842 || TYPE(CHILD(n, i)) == vfpdef)) {
Guido van Rossum4f72a782006-10-27 23:31:49 +0000843 int res = 0;
844 res = handle_keywordonly_args(c, n, i,
845 kwonlyargs, kwdefaults);
846 if (res == -1) goto error;
847 i = res; /* res has new position to process */
848 }
849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000850 break;
851 case DOUBLESTAR:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000852 ch = CHILD(n, i+1); /* tfpdef */
853 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
Neal Norwitzc1505362006-12-28 06:47:50 +0000854 kwarg = NEW_IDENTIFIER(CHILD(ch, 0));
855 if (NCH(ch) > 1) {
856 /* there is an annotation on the kwarg */
857 kwargannotation = ast_for_expr(c, CHILD(ch, 2));
858 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 i += 3;
860 break;
861 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000862 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000863 "unexpected node in varargslist: %d @ %d",
864 TYPE(ch), i);
865 goto error;
Guido van Rossum4f72a782006-10-27 23:31:49 +0000866 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 }
Neal Norwitzc1505362006-12-28 06:47:50 +0000868 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg,
869 kwargannotation, posdefaults, kwdefaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000871 Py_XDECREF(vararg);
872 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873 return NULL;
874}
875
876static expr_ty
877ast_for_dotted_name(struct compiling *c, const node *n)
878{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000879 expr_ty e;
880 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000881 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882 int i;
883
884 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000885
886 lineno = LINENO(n);
887 col_offset = n->n_col_offset;
888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000889 id = NEW_IDENTIFIER(CHILD(n, 0));
890 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000891 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000892 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000893 if (!e)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000894 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
896 for (i = 2; i < NCH(n); i+=2) {
897 id = NEW_IDENTIFIER(CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000898 if (!id)
899 return NULL;
900 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
901 if (!e)
902 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000903 }
904
905 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906}
907
908static expr_ty
909ast_for_decorator(struct compiling *c, const node *n)
910{
911 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
912 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000913 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914
915 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000916 REQ(CHILD(n, 0), AT);
917 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918
919 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
920 if (!name_expr)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000921 return NULL;
922
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923 if (NCH(n) == 3) { /* No arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000924 d = name_expr;
925 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926 }
927 else if (NCH(n) == 5) { /* Call with no arguments */
Thomas Wouters89f507f2006-12-13 04:49:30 +0000928 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000929 n->n_col_offset, c->c_arena);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000930 if (!d)
931 return NULL;
932 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933 }
934 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000935 d = ast_for_call(c, CHILD(n, 3), name_expr);
936 if (!d)
937 return NULL;
938 name_expr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000939 }
940
941 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942}
943
944static asdl_seq*
945ast_for_decorators(struct compiling *c, const node *n)
946{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000947 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000948 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000949 int i;
950
951 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000952 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953 if (!decorator_seq)
954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000956 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000957 d = ast_for_decorator(c, CHILD(n, i));
Thomas Wouters89f507f2006-12-13 04:49:30 +0000958 if (!d)
959 return NULL;
960 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 }
962 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000966ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967{
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000968 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000969 identifier name;
970 arguments_ty args;
971 asdl_seq *body;
Neal Norwitzc1505362006-12-28 06:47:50 +0000972 expr_ty returns = NULL;
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000973 int name_i = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000974
975 REQ(n, funcdef);
976
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 name = NEW_IDENTIFIER(CHILD(n, name_i));
978 if (!name)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000980 args = ast_for_arguments(c, CHILD(n, name_i + 1));
981 if (!args)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000982 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +0000983 if (TYPE(CHILD(n, name_i+2)) == RARROW) {
984 returns = ast_for_expr(c, CHILD(n, name_i + 3));
985 if (!returns)
986 return NULL;
987 name_i += 2;
988 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000989 body = ast_for_suite(c, CHILD(n, name_i + 3));
990 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000991 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Neal Norwitzc1505362006-12-28 06:47:50 +0000993 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000994 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995}
996
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000997static stmt_ty
998ast_for_decorated(struct compiling *c, const node *n)
999{
1000 /* decorated: decorators (classdef | funcdef) */
1001 stmt_ty thing = NULL;
1002 asdl_seq *decorator_seq = NULL;
1003
1004 REQ(n, decorated);
1005
1006 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
1007 if (!decorator_seq)
1008 return NULL;
1009
1010 assert(TYPE(CHILD(n, 1)) == funcdef ||
1011 TYPE(CHILD(n, 1)) == classdef);
1012
1013 if (TYPE(CHILD(n, 1)) == funcdef) {
1014 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
1015 } else if (TYPE(CHILD(n, 1)) == classdef) {
1016 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
1017 }
Christian Heimes09aaa882008-02-23 15:01:06 +00001018 /* we count the decorators in when talking about the class' or
1019 * function's line number */
1020 if (thing) {
1021 thing->lineno = LINENO(n);
1022 thing->col_offset = n->n_col_offset;
1023 }
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001024 return thing;
1025}
1026
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027static expr_ty
1028ast_for_lambdef(struct compiling *c, const node *n)
1029{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001030 /* lambdef: 'lambda' [varargslist] ':' test
1031 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 arguments_ty args;
1033 expr_ty expression;
1034
1035 if (NCH(n) == 3) {
Neal Norwitzc1505362006-12-28 06:47:50 +00001036 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1037 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 if (!args)
1039 return NULL;
1040 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001041 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001043 }
1044 else {
1045 args = ast_for_arguments(c, CHILD(n, 1));
1046 if (!args)
1047 return NULL;
1048 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001049 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051 }
1052
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001053 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054}
1055
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001056static expr_ty
1057ast_for_ifexpr(struct compiling *c, const node *n)
1058{
1059 /* test: or_test 'if' or_test 'else' test */
1060 expr_ty expression, body, orelse;
1061
Thomas Woutersaa8b6c52006-02-27 16:46:22 +00001062 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001063 body = ast_for_expr(c, CHILD(n, 0));
1064 if (!body)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001065 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001066 expression = ast_for_expr(c, CHILD(n, 2));
1067 if (!expression)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001068 return NULL;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001069 orelse = ast_for_expr(c, CHILD(n, 4));
1070 if (!orelse)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001071 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
1073 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001074}
1075
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076/*
Nick Coghlan650f0d02007-04-15 12:05:43 +00001077 Count the number of 'for' loops in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078
Nick Coghlan650f0d02007-04-15 12:05:43 +00001079 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080*/
1081
1082static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001083count_comp_fors(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001084{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001085 int n_fors = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001086
Guido van Rossumd8faa362007-04-27 19:54:29 +00001087 count_comp_for:
1088 n_fors++;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001089 REQ(n, comp_for);
1090 if (NCH(n) == 5)
1091 n = CHILD(n, 4);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001092 else
1093 return n_fors;
1094 count_comp_iter:
Guido van Rossum992d4a32007-07-11 13:09:30 +00001095 REQ(n, comp_iter);
1096 n = CHILD(n, 0);
1097 if (TYPE(n) == comp_for)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001098 goto count_comp_for;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001099 else if (TYPE(n) == comp_if) {
1100 if (NCH(n) == 3) {
1101 n = CHILD(n, 2);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102 goto count_comp_iter;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001103 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 else
1105 return n_fors;
1106 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001107
Guido van Rossumd8faa362007-04-27 19:54:29 +00001108 /* Should never be reached */
1109 PyErr_SetString(PyExc_SystemError,
1110 "logic error in count_comp_fors");
1111 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112}
1113
Nick Coghlan650f0d02007-04-15 12:05:43 +00001114/* Count the number of 'if' statements in a comprehension.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115
Nick Coghlan650f0d02007-04-15 12:05:43 +00001116 Helper for ast_for_comprehension().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117*/
1118
1119static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00001120count_comp_ifs(const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 int n_ifs = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123
Guido van Rossumd8faa362007-04-27 19:54:29 +00001124 while (1) {
1125 REQ(n, comp_iter);
1126 if (TYPE(CHILD(n, 0)) == comp_for)
1127 return n_ifs;
1128 n = CHILD(n, 0);
1129 REQ(n, comp_if);
1130 n_ifs++;
1131 if (NCH(n) == 2)
1132 return n_ifs;
1133 n = CHILD(n, 2);
1134 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001135}
1136
Guido van Rossum992d4a32007-07-11 13:09:30 +00001137static asdl_seq *
1138ast_for_comprehension(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001140 int i, n_fors;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001141 asdl_seq *comps;
1142
Nick Coghlan650f0d02007-04-15 12:05:43 +00001143 n_fors = count_comp_fors(n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 if (n_fors == -1)
1145 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001146
Nick Coghlan650f0d02007-04-15 12:05:43 +00001147 comps = asdl_seq_new(n_fors, c->c_arena);
1148 if (!comps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 for (i = 0; i < n_fors; i++) {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001152 comprehension_ty comp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 asdl_seq *t;
1154 expr_ty expression;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001155 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156
Guido van Rossum992d4a32007-07-11 13:09:30 +00001157 REQ(n, comp_for);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158
Guido van Rossum992d4a32007-07-11 13:09:30 +00001159 for_ch = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001160 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001161 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return NULL;
Guido van Rossum992d4a32007-07-11 13:09:30 +00001163 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001164 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001166
Thomas Wouters89f507f2006-12-13 04:49:30 +00001167 /* Check the # of children rather than the length of t, since
1168 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1169 if (NCH(for_ch) == 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001170 comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
1171 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 else
Guido van Rossum992d4a32007-07-11 13:09:30 +00001173 comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
Nick Coghlan650f0d02007-04-15 12:05:43 +00001174 c->c_arena),
1175 expression, NULL, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001176
Nick Coghlan650f0d02007-04-15 12:05:43 +00001177 if (!comp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001179
Guido van Rossum992d4a32007-07-11 13:09:30 +00001180 if (NCH(n) == 5) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001181 int j, n_ifs;
1182 asdl_seq *ifs;
1183
Guido van Rossum992d4a32007-07-11 13:09:30 +00001184 n = CHILD(n, 4);
1185 n_ifs = count_comp_ifs(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001186 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188
1189 ifs = asdl_seq_new(n_ifs, c->c_arena);
1190 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001191 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 for (j = 0; j < n_ifs; j++) {
Guido van Rossum992d4a32007-07-11 13:09:30 +00001194 REQ(n, comp_iter);
1195 n = CHILD(n, 0);
1196 REQ(n, comp_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197
Guido van Rossum992d4a32007-07-11 13:09:30 +00001198 expression = ast_for_expr(c, CHILD(n, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001199 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001200 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001201 asdl_seq_SET(ifs, j, expression);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001202 if (NCH(n) == 3)
1203 n = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001205 /* on exit, must guarantee that n is a comp_for */
1206 if (TYPE(n) == comp_iter)
1207 n = CHILD(n, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001208 comp->ifs = ifs;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001210 asdl_seq_SET(comps, i, comp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211 }
Guido van Rossum992d4a32007-07-11 13:09:30 +00001212 return comps;
1213}
1214
1215static expr_ty
1216ast_for_itercomp(struct compiling *c, const node *n, int type)
1217{
1218 /* testlist_comp: test ( comp_for | (',' test)* [','] )
1219 argument: [test '='] test [comp_for] # Really [keyword '='] test */
1220 expr_ty elt;
1221 asdl_seq *comps;
1222
1223 assert(NCH(n) > 1);
1224
1225 elt = ast_for_expr(c, CHILD(n, 0));
1226 if (!elt)
1227 return NULL;
1228
1229 comps = ast_for_comprehension(c, CHILD(n, 1));
1230 if (!comps)
1231 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001232
1233 if (type == COMP_GENEXP)
1234 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1235 else if (type == COMP_LISTCOMP)
1236 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1237 else if (type == COMP_SETCOMP)
1238 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1239 else
1240 /* Should never happen */
1241 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242}
1243
1244static expr_ty
Guido van Rossum992d4a32007-07-11 13:09:30 +00001245ast_for_dictcomp(struct compiling *c, const node *n)
1246{
1247 expr_ty key, value;
1248 asdl_seq *comps;
1249
1250 assert(NCH(n) > 3);
1251 REQ(CHILD(n, 1), COLON);
1252
1253 key = ast_for_expr(c, CHILD(n, 0));
1254 if (!key)
1255 return NULL;
1256
1257 value = ast_for_expr(c, CHILD(n, 2));
1258 if (!value)
1259 return NULL;
1260
1261 comps = ast_for_comprehension(c, CHILD(n, 3));
1262 if (!comps)
1263 return NULL;
1264
1265 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1266}
1267
1268static expr_ty
Nick Coghlan650f0d02007-04-15 12:05:43 +00001269ast_for_genexp(struct compiling *c, const node *n)
1270{
1271 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001272 return ast_for_itercomp(c, n, COMP_GENEXP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001273}
1274
1275static expr_ty
1276ast_for_listcomp(struct compiling *c, const node *n)
1277{
1278 assert(TYPE(n) == (testlist_comp));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001279 return ast_for_itercomp(c, n, COMP_LISTCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001280}
1281
1282static expr_ty
1283ast_for_setcomp(struct compiling *c, const node *n)
1284{
1285 assert(TYPE(n) == (dictorsetmaker));
Guido van Rossum992d4a32007-07-11 13:09:30 +00001286 return ast_for_itercomp(c, n, COMP_SETCOMP);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001287}
1288
1289
1290static expr_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291ast_for_atom(struct compiling *c, const node *n)
1292{
Nick Coghlan650f0d02007-04-15 12:05:43 +00001293 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
1294 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
Guido van Rossume7ba4952007-06-06 23:52:48 +00001295 | '...' | 'None' | 'True' | 'False'
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 */
1297 node *ch = CHILD(n, 0);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001298 int bytesmode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299
1300 switch (TYPE(ch)) {
1301 case NAME:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001302 /* All names start in Load context, but may later be
1303 changed. */
1304 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305 case STRING: {
Thomas Wouters00e41de2007-02-23 19:56:57 +00001306 PyObject *str = parsestrplus(c, n, &bytesmode);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001307 if (!str) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00001308 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001309 PyObject *type, *value, *tback, *errstr;
1310 PyErr_Fetch(&type, &value, &tback);
1311 errstr = ((PyUnicodeErrorObject *)value)->reason;
1312 if (errstr) {
1313 char *s = "";
1314 char buf[128];
Amaury Forgeot d'Arc39599dc2007-11-22 02:48:12 +00001315 s = PyUnicode_AsString(errstr);
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001316 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1317 ast_error(n, buf);
1318 } else {
1319 ast_error(n, "(unicode error) unknown error");
1320 }
1321 Py_DECREF(type);
1322 Py_DECREF(value);
1323 Py_XDECREF(tback);
1324 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001325 return NULL;
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001326 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001327 PyArena_AddPyObject(c->c_arena, str);
Thomas Wouters00e41de2007-02-23 19:56:57 +00001328 if (bytesmode)
1329 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena);
1330 else
1331 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332 }
1333 case NUMBER: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001334 PyObject *pynum = parsenumber(STR(ch));
1335 if (!pynum)
1336 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001337
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 PyArena_AddPyObject(c->c_arena, pynum);
1339 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 }
Georg Brandldde00282007-03-18 19:01:53 +00001341 case ELLIPSIS: /* Ellipsis */
Neal Norwitzc1505362006-12-28 06:47:50 +00001342 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 case LPAR: /* some parenthesized expressions */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001344 ch = CHILD(n, 1);
1345
1346 if (TYPE(ch) == RPAR)
1347 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1348
1349 if (TYPE(ch) == yield_expr)
1350 return ast_for_expr(c, ch);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001351
1352 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
1353 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
Thomas Wouters89f507f2006-12-13 04:49:30 +00001354 return ast_for_genexp(c, ch);
1355
Nick Coghlan650f0d02007-04-15 12:05:43 +00001356 return ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 case LSQB: /* list (or list comprehension) */
Thomas Wouters89f507f2006-12-13 04:49:30 +00001358 ch = CHILD(n, 1);
1359
1360 if (TYPE(ch) == RSQB)
1361 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1362
Nick Coghlan650f0d02007-04-15 12:05:43 +00001363 REQ(ch, testlist_comp);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001364 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1365 asdl_seq *elts = seq_for_testlist(c, ch);
1366 if (!elts)
1367 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001368
Thomas Wouters89f507f2006-12-13 04:49:30 +00001369 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1370 }
1371 else
1372 return ast_for_listcomp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373 case LBRACE: {
Nick Coghlan650f0d02007-04-15 12:05:43 +00001374 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] |
1375 * test (gen_for | (',' test)* [',']) */
Neal Norwitzc1505362006-12-28 06:47:50 +00001376 int i, size;
1377 asdl_seq *keys, *values;
1378
1379 ch = CHILD(n, 1);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001380 if (TYPE(ch) == RBRACE) {
1381 /* it's an empty dict */
1382 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1383 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1384 /* it's a simple set */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001385 asdl_seq *elts;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001386 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
Guido van Rossum4d2adcc2007-04-17 21:58:50 +00001387 elts = asdl_seq_new(size, c->c_arena);
Nick Coghlan650f0d02007-04-15 12:05:43 +00001388 if (!elts)
Guido van Rossum86e58e22006-08-28 15:27:34 +00001389 return NULL;
Guido van Rossum86e58e22006-08-28 15:27:34 +00001390 for (i = 0; i < NCH(ch); i += 2) {
1391 expr_ty expression;
1392 expression = ast_for_expr(c, CHILD(ch, i));
1393 if (!expression)
1394 return NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001395 asdl_seq_SET(elts, i / 2, expression);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001396 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001397 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1398 } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1399 /* it's a set comprehension */
1400 return ast_for_setcomp(c, ch);
Guido van Rossum992d4a32007-07-11 13:09:30 +00001401 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1402 return ast_for_dictcomp(c, ch);
Guido van Rossum86e58e22006-08-28 15:27:34 +00001403 } else {
1404 /* it's a dict */
1405 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1406 keys = asdl_seq_new(size, c->c_arena);
1407 if (!keys)
1408 return NULL;
1409
1410 values = asdl_seq_new(size, c->c_arena);
1411 if (!values)
1412 return NULL;
1413
1414 for (i = 0; i < NCH(ch); i += 4) {
1415 expr_ty expression;
1416
1417 expression = ast_for_expr(c, CHILD(ch, i));
1418 if (!expression)
1419 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001420
Guido van Rossum86e58e22006-08-28 15:27:34 +00001421 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitze76adcd2005-11-15 05:04:31 +00001422
Guido van Rossum86e58e22006-08-28 15:27:34 +00001423 expression = ast_for_expr(c, CHILD(ch, i + 2));
1424 if (!expression)
1425 return NULL;
1426
1427 asdl_seq_SET(values, i / 4, expression);
1428 }
1429 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1430 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 default:
Thomas Wouters89f507f2006-12-13 04:49:30 +00001433 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1434 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 }
1436}
1437
1438static slice_ty
1439ast_for_slice(struct compiling *c, const node *n)
1440{
1441 node *ch;
1442 expr_ty lower = NULL, upper = NULL, step = NULL;
1443
1444 REQ(n, subscript);
1445
1446 /*
Georg Brandl52318d62006-09-06 07:06:08 +00001447 subscript: test | [test] ':' [test] [sliceop]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 sliceop: ':' [test]
1449 */
1450 ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451 if (NCH(n) == 1 && TYPE(ch) == test) {
1452 /* 'step' variable hold no significance in terms of being used over
1453 other vars */
1454 step = ast_for_expr(c, ch);
1455 if (!step)
1456 return NULL;
1457
Thomas Wouters89f507f2006-12-13 04:49:30 +00001458 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 }
1460
1461 if (TYPE(ch) == test) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462 lower = ast_for_expr(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 if (!lower)
1464 return NULL;
1465 }
1466
1467 /* If there's an upper bound it's in the second or third position. */
1468 if (TYPE(ch) == COLON) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001469 if (NCH(n) > 1) {
1470 node *n2 = CHILD(n, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471
Thomas Wouters89f507f2006-12-13 04:49:30 +00001472 if (TYPE(n2) == test) {
1473 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474 if (!upper)
1475 return NULL;
1476 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 } else if (NCH(n) > 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001479 node *n2 = CHILD(n, 2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480
Thomas Wouters89f507f2006-12-13 04:49:30 +00001481 if (TYPE(n2) == test) {
1482 upper = ast_for_expr(c, n2);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 if (!upper)
1484 return NULL;
1485 }
1486 }
1487
1488 ch = CHILD(n, NCH(n) - 1);
1489 if (TYPE(ch) == sliceop) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001490 if (NCH(ch) == 1) {
1491 /* No expression, so step is None */
1492 ch = CHILD(ch, 0);
1493 step = Name(new_identifier("None", c->c_arena), Load,
1494 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495 if (!step)
1496 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001497 } else {
1498 ch = CHILD(ch, 1);
1499 if (TYPE(ch) == test) {
1500 step = ast_for_expr(c, ch);
1501 if (!step)
1502 return NULL;
1503 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001504 }
1505 }
1506
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001507 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508}
1509
1510static expr_ty
1511ast_for_binop(struct compiling *c, const node *n)
1512{
Guido van Rossumd8faa362007-04-27 19:54:29 +00001513 /* Must account for a sequence of expressions.
1514 How should A op B op C by represented?
1515 BinOp(BinOp(A, op, B), op, C).
1516 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001517
Guido van Rossumd8faa362007-04-27 19:54:29 +00001518 int i, nops;
1519 expr_ty expr1, expr2, result;
1520 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521
Guido van Rossumd8faa362007-04-27 19:54:29 +00001522 expr1 = ast_for_expr(c, CHILD(n, 0));
1523 if (!expr1)
1524 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
Guido van Rossumd8faa362007-04-27 19:54:29 +00001526 expr2 = ast_for_expr(c, CHILD(n, 2));
1527 if (!expr2)
1528 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529
Guido van Rossumd8faa362007-04-27 19:54:29 +00001530 newoperator = get_operator(CHILD(n, 1));
1531 if (!newoperator)
1532 return NULL;
1533
1534 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1535 c->c_arena);
1536 if (!result)
1537 return NULL;
1538
1539 nops = (NCH(n) - 1) / 2;
1540 for (i = 1; i < nops; i++) {
1541 expr_ty tmp_result, tmp;
1542 const node* next_oper = CHILD(n, i * 2 + 1);
1543
1544 newoperator = get_operator(next_oper);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546 return NULL;
1547
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1549 if (!tmp)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001550 return NULL;
1551
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 tmp_result = BinOp(result, newoperator, tmp,
1553 LINENO(next_oper), next_oper->n_col_offset,
1554 c->c_arena);
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001555 if (!tmp_result)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001556 return NULL;
1557 result = tmp_result;
1558 }
1559 return result;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001560}
1561
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001562static expr_ty
1563ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1564{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001565 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1566 subscriptlist: subscript (',' subscript)* [',']
1567 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1568 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001569 REQ(n, trailer);
1570 if (TYPE(CHILD(n, 0)) == LPAR) {
1571 if (NCH(n) == 2)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001572 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1573 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001574 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001575 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001576 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001577 else if (TYPE(CHILD(n, 0)) == DOT ) {
1578 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001579 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001580 }
1581 else {
1582 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001583 REQ(CHILD(n, 2), RSQB);
1584 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001585 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001586 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1587 if (!slc)
1588 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001589 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1590 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001591 }
1592 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001593 /* The grammar is ambiguous here. The ambiguity is resolved
1594 by treating the sequence as a tuple literal if there are
1595 no slice features.
1596 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001597 int j;
1598 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001599 expr_ty e;
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001600 int simple = 1;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001601 asdl_seq *slices, *elts;
1602 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001603 if (!slices)
1604 return NULL;
1605 for (j = 0; j < NCH(n); j += 2) {
1606 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001607 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001608 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001609 if (slc->kind != Index_kind)
Neal Norwitz6baa4c42007-02-26 19:14:12 +00001610 simple = 0;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001611 asdl_seq_SET(slices, j / 2, slc);
1612 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001613 if (!simple) {
1614 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001615 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001616 }
1617 /* extract Index values and put them in a Tuple */
1618 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001619 if (!elts)
1620 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001621 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1622 slc = (slice_ty)asdl_seq_GET(slices, j);
1623 assert(slc->kind == Index_kind && slc->v.Index.value);
1624 asdl_seq_SET(elts, j, slc->v.Index.value);
1625 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001626 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001627 if (!e)
1628 return NULL;
1629 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001630 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001631 }
1632 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001633}
1634
1635static expr_ty
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001636ast_for_factor(struct compiling *c, const node *n)
1637{
1638 node *pfactor, *ppower, *patom, *pnum;
1639 expr_ty expression;
1640
1641 /* If the unary - operator is applied to a constant, don't generate
1642 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1643 constant. The peephole optimizer already does something like
1644 this but it doesn't handle the case where the constant is
1645 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1646 PyLongObject.
1647 */
1648 if (TYPE(CHILD(n, 0)) == MINUS
1649 && NCH(n) == 2
1650 && TYPE((pfactor = CHILD(n, 1))) == factor
1651 && NCH(pfactor) == 1
1652 && TYPE((ppower = CHILD(pfactor, 0))) == power
1653 && NCH(ppower) == 1
1654 && TYPE((patom = CHILD(ppower, 0))) == atom
1655 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1656 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1657 if (s == NULL)
1658 return NULL;
1659 s[0] = '-';
1660 strcpy(s + 1, STR(pnum));
1661 PyObject_FREE(STR(pnum));
1662 STR(pnum) = s;
1663 return ast_for_atom(c, patom);
1664 }
1665
1666 expression = ast_for_expr(c, CHILD(n, 1));
1667 if (!expression)
1668 return NULL;
1669
1670 switch (TYPE(CHILD(n, 0))) {
1671 case PLUS:
1672 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1673 c->c_arena);
1674 case MINUS:
1675 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1676 c->c_arena);
1677 case TILDE:
1678 return UnaryOp(Invert, expression, LINENO(n),
1679 n->n_col_offset, c->c_arena);
1680 }
1681 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1682 TYPE(CHILD(n, 0)));
1683 return NULL;
1684}
1685
1686static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001687ast_for_power(struct compiling *c, const node *n)
1688{
1689 /* power: atom trailer* ('**' factor)*
1690 */
1691 int i;
1692 expr_ty e, tmp;
1693 REQ(n, power);
1694 e = ast_for_atom(c, CHILD(n, 0));
1695 if (!e)
1696 return NULL;
1697 if (NCH(n) == 1)
1698 return e;
1699 for (i = 1; i < NCH(n); i++) {
1700 node *ch = CHILD(n, i);
1701 if (TYPE(ch) != trailer)
1702 break;
1703 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001704 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001705 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001706 tmp->lineno = e->lineno;
1707 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001708 e = tmp;
1709 }
1710 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1711 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001712 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001713 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001714 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001715 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001716 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001717 e = tmp;
1718 }
1719 return e;
1720}
1721
Guido van Rossum0368b722007-05-11 16:50:42 +00001722static expr_ty
1723ast_for_starred(struct compiling *c, const node *n)
1724{
1725 expr_ty tmp;
1726 REQ(n, star_expr);
1727
1728 tmp = ast_for_expr(c, CHILD(n, 1));
1729 if (!tmp)
1730 return NULL;
1731
1732 /* The Load context is changed later. */
1733 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
1734}
1735
1736
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737/* Do not name a variable 'expr'! Will cause a compile error.
1738*/
1739
1740static expr_ty
1741ast_for_expr(struct compiling *c, const node *n)
1742{
1743 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001744 test: or_test ['if' or_test 'else' test] | lambdef
Nick Coghlan650f0d02007-04-15 12:05:43 +00001745 test_nocond: or_test | lambdef_nocond
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001746 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001747 and_test: not_test ('and' not_test)*
1748 not_test: 'not' not_test | comparison
1749 comparison: expr (comp_op expr)*
1750 expr: xor_expr ('|' xor_expr)*
1751 xor_expr: and_expr ('^' and_expr)*
1752 and_expr: shift_expr ('&' shift_expr)*
1753 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1754 arith_expr: term (('+'|'-') term)*
1755 term: factor (('*'|'/'|'%'|'//') factor)*
1756 factor: ('+'|'-'|'~') factor | power
1757 power: atom trailer* ('**' factor)*
1758 */
1759
1760 asdl_seq *seq;
1761 int i;
1762
1763 loop:
1764 switch (TYPE(n)) {
1765 case test:
Nick Coghlan650f0d02007-04-15 12:05:43 +00001766 case test_nocond:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001767 if (TYPE(CHILD(n, 0)) == lambdef ||
Nick Coghlan650f0d02007-04-15 12:05:43 +00001768 TYPE(CHILD(n, 0)) == lambdef_nocond)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001770 else if (NCH(n) > 1)
1771 return ast_for_ifexpr(c, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001772 /* Fallthrough */
1773 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001774 case and_test:
1775 if (NCH(n) == 1) {
1776 n = CHILD(n, 0);
1777 goto loop;
1778 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001779 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 if (!seq)
1781 return NULL;
1782 for (i = 0; i < NCH(n); i += 2) {
1783 expr_ty e = ast_for_expr(c, CHILD(n, i));
1784 if (!e)
1785 return NULL;
1786 asdl_seq_SET(seq, i / 2, e);
1787 }
1788 if (!strcmp(STR(CHILD(n, 1)), "and"))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001789 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1790 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001791 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001792 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 case not_test:
1794 if (NCH(n) == 1) {
1795 n = CHILD(n, 0);
1796 goto loop;
1797 }
1798 else {
1799 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1800 if (!expression)
1801 return NULL;
1802
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1804 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 }
1806 case comparison:
1807 if (NCH(n) == 1) {
1808 n = CHILD(n, 0);
1809 goto loop;
1810 }
1811 else {
1812 expr_ty expression;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001813 asdl_int_seq *ops;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001814 asdl_seq *cmps;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001816 if (!ops)
1817 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001818 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820 return NULL;
1821 }
1822 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001823 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825 newoperator = ast_for_comp_op(CHILD(n, i));
1826 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829
1830 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001831 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001835 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 asdl_seq_SET(cmps, i / 2, expression);
1837 }
1838 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001839 if (!expression) {
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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 return Compare(expression, ops, cmps, LINENO(n),
1844 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845 }
1846 break;
1847
Guido van Rossum0368b722007-05-11 16:50:42 +00001848 case star_expr:
1849 if (TYPE(CHILD(n, 0)) == STAR) {
1850 return ast_for_starred(c, n);
1851 }
1852 /* Fallthrough */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 /* The next five cases all handle BinOps. The main body of code
1854 is the same in each case, but the switch turned inside out to
1855 reuse the code for each type of operator.
1856 */
1857 case expr:
1858 case xor_expr:
1859 case and_expr:
1860 case shift_expr:
1861 case arith_expr:
1862 case term:
1863 if (NCH(n) == 1) {
1864 n = CHILD(n, 0);
1865 goto loop;
1866 }
1867 return ast_for_binop(c, n);
1868 case yield_expr: {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001869 expr_ty exp = NULL;
1870 if (NCH(n) == 2) {
1871 exp = ast_for_testlist(c, CHILD(n, 1));
1872 if (!exp)
1873 return NULL;
1874 }
1875 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1876 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001877 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 if (NCH(n) == 1) {
1879 n = CHILD(n, 0);
1880 goto loop;
1881 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001882 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001883 case power:
1884 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001886 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887 return NULL;
1888 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001889 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890 return NULL;
1891}
1892
1893static expr_ty
1894ast_for_call(struct compiling *c, const node *n, expr_ty func)
1895{
1896 /*
1897 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1898 | '**' test)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001899 argument: [test '='] test [comp_for] # Really [keyword '='] test
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 */
1901
1902 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001903 asdl_seq *args;
1904 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 expr_ty vararg = NULL, kwarg = NULL;
1906
1907 REQ(n, arglist);
1908
1909 nargs = 0;
1910 nkeywords = 0;
1911 ngens = 0;
1912 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001913 node *ch = CHILD(n, i);
1914 if (TYPE(ch) == argument) {
1915 if (NCH(ch) == 1)
1916 nargs++;
Nick Coghlan650f0d02007-04-15 12:05:43 +00001917 else if (TYPE(CHILD(ch, 1)) == comp_for)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001918 ngens++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001919 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920 nkeywords++;
1921 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001922 }
1923 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001924 ast_error(n, "Generator expression must be parenthesized "
Thomas Wouters89f507f2006-12-13 04:49:30 +00001925 "if not sole argument");
1926 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 }
1928
1929 if (nargs + nkeywords + ngens > 255) {
1930 ast_error(n, "more than 255 arguments");
1931 return NULL;
1932 }
1933
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001934 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001936 return NULL;
1937 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001939 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 nargs = 0;
1941 nkeywords = 0;
1942 for (i = 0; i < NCH(n); i++) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001943 node *ch = CHILD(n, i);
1944 if (TYPE(ch) == argument) {
1945 expr_ty e;
1946 if (NCH(ch) == 1) {
1947 if (nkeywords) {
1948 ast_error(CHILD(ch, 0),
1949 "non-keyword arg after keyword arg");
1950 return NULL;
1951 }
1952 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001953 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001954 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001955 asdl_seq_SET(args, nargs++, e);
1956 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00001957 else if (TYPE(CHILD(ch, 1)) == comp_for) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 e = ast_for_genexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001960 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001961 asdl_seq_SET(args, nargs++, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001963 else {
1964 keyword_ty kw;
1965 identifier key;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001966
Thomas Wouters89f507f2006-12-13 04:49:30 +00001967 /* CHILD(ch, 0) is test, but must be an identifier? */
1968 e = ast_for_expr(c, CHILD(ch, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 /* f(lambda x: x[0] = 3) ends up getting parsed with
1972 * LHS test = lambda x: x[0], and RHS test = 3.
1973 * SF bug 132313 points out that complaining about a keyword
1974 * then is very confusing.
1975 */
1976 if (e->kind == Lambda_kind) {
1977 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001978 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979 } else if (e->kind != Name_kind) {
1980 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001981 return NULL;
Guido van Rossume7ba4952007-06-06 23:52:48 +00001982 } else if (forbidden_name(e, ch)) {
1983 return NULL;
1984 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001985 key = e->v.Name.id;
1986 e = ast_for_expr(c, CHILD(ch, 2));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001989 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001990 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001991 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001992 asdl_seq_SET(keywords, nkeywords++, kw);
1993 }
1994 }
1995 else if (TYPE(ch) == STAR) {
1996 vararg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001997 if (!vararg)
1998 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001999 i++;
2000 }
2001 else if (TYPE(ch) == DOUBLESTAR) {
2002 kwarg = ast_for_expr(c, CHILD(n, i+1));
Christian Heimesdd15f6c2008-03-16 00:07:10 +00002003 if (!kwarg)
2004 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002005 i++;
2006 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007 }
2008
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002009 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002010}
2011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002013ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014{
Nick Coghlan650f0d02007-04-15 12:05:43 +00002015 /* testlist_comp: test (comp_for | (',' test)* [',']) */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002016 /* testlist: test (',' test)* [','] */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002017 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 assert(NCH(n) > 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002019 if (TYPE(n) == testlist_comp) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002020 if (NCH(n) > 1)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002021 assert(TYPE(CHILD(n, 1)) != comp_for);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002022 }
2023 else {
2024 assert(TYPE(n) == testlist ||
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002025 TYPE(n) == testlist1);
2026 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027 if (NCH(n) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002028 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002029 else {
2030 asdl_seq *tmp = seq_for_testlist(c, n);
2031 if (!tmp)
2032 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002033 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002035}
2036
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037static stmt_ty
2038ast_for_expr_stmt(struct compiling *c, const node *n)
2039{
2040 REQ(n, expr_stmt);
2041 /* expr_stmt: testlist (augassign (yield_expr|testlist)
2042 | ('=' (yield_expr|testlist))*)
2043 testlist: test (',' test)* [',']
2044 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
Thomas Wouters89f507f2006-12-13 04:49:30 +00002045 | '<<=' | '>>=' | '**=' | '//='
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046 test: ... here starts the operator precendence dance
2047 */
2048
2049 if (NCH(n) == 1) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002050 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051 if (!e)
2052 return NULL;
2053
Thomas Wouters89f507f2006-12-13 04:49:30 +00002054 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 }
2056 else if (TYPE(CHILD(n, 1)) == augassign) {
2057 expr_ty expr1, expr2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002058 operator_ty newoperator;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002059 node *ch = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060
Thomas Wouters89f507f2006-12-13 04:49:30 +00002061 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 if (!expr1)
2063 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002064 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002065 switch (expr1->kind) {
2066 case GeneratorExp_kind:
2067 ast_error(ch, "augmented assignment to generator "
2068 "expression not possible");
2069 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002070 case Yield_kind:
2071 ast_error(ch, "augmented assignment to yield "
2072 "expression not possible");
2073 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002074 case Name_kind: {
Guido van Rossume7ba4952007-06-06 23:52:48 +00002075 if (forbidden_name(expr1, ch))
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002076 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00002077 break;
2078 }
2079 case Attribute_kind:
2080 case Subscript_kind:
2081 break;
2082 default:
2083 ast_error(ch, "illegal expression for augmented "
2084 "assignment");
2085 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002087 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 ch = CHILD(n, 2);
2090 if (TYPE(ch) == testlist)
2091 expr2 = ast_for_testlist(c, ch);
2092 else
2093 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002094 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 return NULL;
2096
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002097 newoperator = ast_for_augassign(CHILD(n, 1));
2098 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 return NULL;
2100
Thomas Wouters89f507f2006-12-13 04:49:30 +00002101 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 }
2103 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002104 int i;
2105 asdl_seq *targets;
2106 node *value;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 expr_ty expression;
2108
Thomas Wouters89f507f2006-12-13 04:49:30 +00002109 /* a normal assignment */
2110 REQ(CHILD(n, 1), EQUAL);
2111 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2112 if (!targets)
2113 return NULL;
2114 for (i = 0; i < NCH(n) - 2; i += 2) {
2115 expr_ty e;
2116 node *ch = CHILD(n, i);
2117 if (TYPE(ch) == yield_expr) {
2118 ast_error(ch, "assignment to yield expression not possible");
2119 return NULL;
2120 }
2121 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002122
Thomas Wouters89f507f2006-12-13 04:49:30 +00002123 /* set context to assign */
2124 if (!e)
2125 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126
Thomas Wouters89f507f2006-12-13 04:49:30 +00002127 if (!set_context(e, Store, CHILD(n, i)))
2128 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129
Thomas Wouters89f507f2006-12-13 04:49:30 +00002130 asdl_seq_SET(targets, i / 2, e);
2131 }
2132 value = CHILD(n, NCH(n) - 1);
2133 if (TYPE(value) == testlist)
2134 expression = ast_for_testlist(c, value);
2135 else
2136 expression = ast_for_expr(c, value);
2137 if (!expression)
2138 return NULL;
2139 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141}
2142
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143static asdl_seq *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002144ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002145{
2146 asdl_seq *seq;
2147 int i;
2148 expr_ty e;
2149
2150 REQ(n, exprlist);
2151
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002152 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 for (i = 0; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002156 e = ast_for_expr(c, CHILD(n, i));
2157 if (!e)
2158 return NULL;
2159 asdl_seq_SET(seq, i / 2, e);
2160 if (context && !set_context(e, context, CHILD(n, i)))
2161 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 }
2163 return seq;
2164}
2165
2166static stmt_ty
2167ast_for_del_stmt(struct compiling *c, const node *n)
2168{
2169 asdl_seq *expr_list;
2170
2171 /* del_stmt: 'del' exprlist */
2172 REQ(n, del_stmt);
2173
2174 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2175 if (!expr_list)
2176 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002177 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178}
2179
2180static stmt_ty
2181ast_for_flow_stmt(struct compiling *c, const node *n)
2182{
2183 /*
2184 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2185 | yield_stmt
2186 break_stmt: 'break'
2187 continue_stmt: 'continue'
2188 return_stmt: 'return' [testlist]
2189 yield_stmt: yield_expr
2190 yield_expr: 'yield' testlist
2191 raise_stmt: 'raise' [test [',' test [',' test]]]
2192 */
2193 node *ch;
2194
2195 REQ(n, flow_stmt);
2196 ch = CHILD(n, 0);
2197 switch (TYPE(ch)) {
2198 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002199 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002200 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002201 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002202 case yield_stmt: { /* will reduce to yield_expr */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002203 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2204 if (!exp)
2205 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002206 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207 }
2208 case return_stmt:
2209 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002210 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002212 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213 if (!expression)
2214 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002215 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002216 }
2217 case raise_stmt:
2218 if (NCH(ch) == 1)
Collin Winter828f04a2007-08-31 00:04:24 +00002219 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
2220 else if (NCH(ch) >= 2) {
2221 expr_ty cause = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2223 if (!expression)
2224 return NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002225 if (NCH(ch) == 4) {
2226 cause = ast_for_expr(c, CHILD(ch, 3));
2227 if (!cause)
2228 return NULL;
2229 }
2230 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002231 }
2232 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002233 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002234 "unexpected flow_stmt: %d", TYPE(ch));
2235 return NULL;
2236 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002237
2238 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2239 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240}
2241
2242static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002243alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244{
2245 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002246 import_as_name: NAME ['as' NAME]
2247 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002248 dotted_name: NAME ('.' NAME)*
2249 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002250 PyObject *str;
2251
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252 loop:
2253 switch (TYPE(n)) {
2254 case import_as_name:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002255 str = NULL;
2256 if (NCH(n) == 3) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002257 str = NEW_IDENTIFIER(CHILD(n, 2));
2258 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002259 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260 case dotted_as_name:
2261 if (NCH(n) == 1) {
2262 n = CHILD(n, 0);
2263 goto loop;
2264 }
2265 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002266 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002267 if (!a)
2268 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269 assert(!a->asname);
2270 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2271 return a;
2272 }
2273 break;
2274 case dotted_name:
2275 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002276 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 else {
2278 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002279 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002280 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281 char *s;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002282 PyObject *uni;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283
2284 len = 0;
2285 for (i = 0; i < NCH(n); i += 2)
2286 /* length of string plus one for the dot */
2287 len += strlen(STR(CHILD(n, i))) + 1;
2288 len--; /* the last name doesn't have a dot */
2289 str = PyString_FromStringAndSize(NULL, len);
2290 if (!str)
2291 return NULL;
2292 s = PyString_AS_STRING(str);
2293 if (!s)
2294 return NULL;
2295 for (i = 0; i < NCH(n); i += 2) {
2296 char *sch = STR(CHILD(n, i));
2297 strcpy(s, STR(CHILD(n, i)));
2298 s += strlen(sch);
2299 *s++ = '.';
2300 }
2301 --s;
2302 *s = '\0';
Martin v. Löwis5b222132007-06-10 09:51:05 +00002303 uni = PyUnicode_DecodeUTF8(PyString_AS_STRING(str),
2304 PyString_GET_SIZE(str),
2305 NULL);
2306 Py_DECREF(str);
2307 if (!uni)
2308 return NULL;
2309 str = uni;
2310 PyUnicode_InternInPlace(&str);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002311 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002312 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002313 }
2314 break;
2315 case STAR:
Martin v. Löwis5b222132007-06-10 09:51:05 +00002316 str = PyUnicode_InternFromString("*");
Thomas Wouters89f507f2006-12-13 04:49:30 +00002317 PyArena_AddPyObject(c->c_arena, str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002318 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002320 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 "unexpected import name: %d", TYPE(n));
2322 return NULL;
2323 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002324
2325 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 return NULL;
2327}
2328
2329static stmt_ty
2330ast_for_import_stmt(struct compiling *c, const node *n)
2331{
2332 /*
2333 import_stmt: import_name | import_from
2334 import_name: 'import' dotted_as_names
Georg Brandle66c8c72007-03-19 18:56:50 +00002335 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
2336 'import' ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002338 int lineno;
2339 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 int i;
2341 asdl_seq *aliases;
2342
2343 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002344 lineno = LINENO(n);
2345 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002347 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 n = CHILD(n, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00002349 REQ(n, dotted_as_names);
2350 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2351 if (!aliases)
2352 return NULL;
2353 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002354 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002355 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002357 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002359 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002360 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002361 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 int n_children;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 int idx, ndots = 0;
2364 alias_ty mod = NULL;
2365 identifier modname;
2366
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002367 /* Count the number of dots (for relative imports) and check for the
2368 optional module name */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002369 for (idx = 1; idx < NCH(n); idx++) {
2370 if (TYPE(CHILD(n, idx)) == dotted_name) {
2371 mod = alias_for_import_name(c, CHILD(n, idx));
2372 idx++;
2373 break;
Georg Brandle66c8c72007-03-19 18:56:50 +00002374 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
2375 /* three consecutive dots are tokenized as one ELLIPSIS */
2376 ndots += 3;
2377 continue;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002378 } else if (TYPE(CHILD(n, idx)) != DOT) {
2379 break;
2380 }
2381 ndots++;
2382 }
2383 idx++; /* skip over the 'import' keyword */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002384 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002385 case STAR:
2386 /* from ... import * */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002387 n = CHILD(n, idx);
2388 n_children = 1;
2389 if (ndots) {
2390 ast_error(n, "'import *' not allowed with 'from .'");
2391 return NULL;
2392 }
2393 break;
2394 case LPAR:
2395 /* from ... import (x, y, z) */
2396 n = CHILD(n, idx + 1);
2397 n_children = NCH(n);
2398 break;
2399 case import_as_names:
2400 /* from ... import x, y, z */
2401 n = CHILD(n, idx);
2402 n_children = NCH(n);
Thomas Wouters106203c2006-02-27 17:05:19 +00002403 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 ast_error(n, "trailing comma not allowed without"
2405 " surrounding parentheses");
2406 return NULL;
2407 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002408 break;
2409 default:
2410 ast_error(n, "Unexpected node-type in from-import");
2411 return NULL;
2412 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413
Thomas Wouters89f507f2006-12-13 04:49:30 +00002414 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2415 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002416 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002417
2418 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002419 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002420 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002421 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002422 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002423 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002424 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002425 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002426 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00002427 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2428 if (!import_alias)
2429 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002430 asdl_seq_SET(aliases, i / 2, import_alias);
Jeremy Hyltona8293132006-02-28 17:58:27 +00002431 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002433 if (mod != NULL)
2434 modname = mod->name;
2435 else
2436 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002437 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002438 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439 }
Neal Norwitz79792652005-11-14 04:25:03 +00002440 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 "unknown import statement: starts with command '%s'",
2442 STR(CHILD(n, 0)));
2443 return NULL;
2444}
2445
2446static stmt_ty
2447ast_for_global_stmt(struct compiling *c, const node *n)
2448{
2449 /* global_stmt: 'global' NAME (',' NAME)* */
2450 identifier name;
2451 asdl_seq *s;
2452 int i;
2453
2454 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002455 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 if (!s)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002457 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002459 name = NEW_IDENTIFIER(CHILD(n, i));
2460 if (!name)
2461 return NULL;
2462 asdl_seq_SET(s, i / 2, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002463 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002464 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465}
2466
2467static stmt_ty
Jeremy Hylton81e95022007-02-27 06:50:52 +00002468ast_for_nonlocal_stmt(struct compiling *c, const node *n)
2469{
2470 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
2471 identifier name;
2472 asdl_seq *s;
2473 int i;
2474
2475 REQ(n, nonlocal_stmt);
2476 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2477 if (!s)
2478 return NULL;
2479 for (i = 1; i < NCH(n); i += 2) {
2480 name = NEW_IDENTIFIER(CHILD(n, i));
2481 if (!name)
2482 return NULL;
2483 asdl_seq_SET(s, i / 2, name);
2484 }
2485 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
2486}
2487
2488static stmt_ty
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489ast_for_assert_stmt(struct compiling *c, const node *n)
2490{
2491 /* assert_stmt: 'assert' test [',' test] */
2492 REQ(n, assert_stmt);
2493 if (NCH(n) == 2) {
2494 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2495 if (!expression)
2496 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002497 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498 }
2499 else if (NCH(n) == 4) {
2500 expr_ty expr1, expr2;
2501
2502 expr1 = ast_for_expr(c, CHILD(n, 1));
2503 if (!expr1)
2504 return NULL;
2505 expr2 = ast_for_expr(c, CHILD(n, 3));
2506 if (!expr2)
2507 return NULL;
2508
Thomas Wouters89f507f2006-12-13 04:49:30 +00002509 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002510 }
Neal Norwitz79792652005-11-14 04:25:03 +00002511 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002512 "improper number of parts to 'assert' statement: %d",
2513 NCH(n));
2514 return NULL;
2515}
2516
2517static asdl_seq *
2518ast_for_suite(struct compiling *c, const node *n)
2519{
2520 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002521 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522 stmt_ty s;
2523 int i, total, num, end, pos = 0;
2524 node *ch;
2525
2526 REQ(n, suite);
2527
2528 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002529 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530 if (!seq)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002531 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532 if (TYPE(CHILD(n, 0)) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002533 n = CHILD(n, 0);
2534 /* simple_stmt always ends with a NEWLINE,
2535 and may have a trailing SEMI
2536 */
2537 end = NCH(n) - 1;
2538 if (TYPE(CHILD(n, end - 1)) == SEMI)
2539 end--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540 /* loop by 2 to skip semi-colons */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002541 for (i = 0; i < end; i += 2) {
2542 ch = CHILD(n, i);
2543 s = ast_for_stmt(c, ch);
2544 if (!s)
2545 return NULL;
2546 asdl_seq_SET(seq, pos++, s);
2547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
2549 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002550 for (i = 2; i < (NCH(n) - 1); i++) {
2551 ch = CHILD(n, i);
2552 REQ(ch, stmt);
2553 num = num_stmts(ch);
2554 if (num == 1) {
2555 /* small_stmt or compound_stmt with only one child */
2556 s = ast_for_stmt(c, ch);
2557 if (!s)
2558 return NULL;
2559 asdl_seq_SET(seq, pos++, s);
2560 }
2561 else {
2562 int j;
2563 ch = CHILD(ch, 0);
2564 REQ(ch, simple_stmt);
2565 for (j = 0; j < NCH(ch); j += 2) {
2566 /* statement terminates with a semi-colon ';' */
2567 if (NCH(CHILD(ch, j)) == 0) {
2568 assert((j + 1) == NCH(ch));
2569 break;
2570 }
2571 s = ast_for_stmt(c, CHILD(ch, j));
2572 if (!s)
2573 return NULL;
2574 asdl_seq_SET(seq, pos++, s);
2575 }
2576 }
2577 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578 }
2579 assert(pos == seq->size);
2580 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581}
2582
2583static stmt_ty
2584ast_for_if_stmt(struct compiling *c, const node *n)
2585{
2586 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2587 ['else' ':' suite]
2588 */
2589 char *s;
2590
2591 REQ(n, if_stmt);
2592
2593 if (NCH(n) == 4) {
2594 expr_ty expression;
2595 asdl_seq *suite_seq;
2596
2597 expression = ast_for_expr(c, CHILD(n, 1));
2598 if (!expression)
2599 return NULL;
2600 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002601 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 return NULL;
2603
Guido van Rossumd8faa362007-04-27 19:54:29 +00002604 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2605 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002607
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002608 s = STR(CHILD(n, 4));
2609 /* s[2], the third character in the string, will be
2610 's' for el_s_e, or
2611 'i' for el_i_f
2612 */
2613 if (s[2] == 's') {
2614 expr_ty expression;
2615 asdl_seq *seq1, *seq2;
2616
2617 expression = ast_for_expr(c, CHILD(n, 1));
2618 if (!expression)
2619 return NULL;
2620 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002621 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622 return NULL;
2623 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002624 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 return NULL;
2626
Guido van Rossumd8faa362007-04-27 19:54:29 +00002627 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2628 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629 }
2630 else if (s[2] == 'i') {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002631 int i, n_elif, has_else = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002632 expr_ty expression;
2633 asdl_seq *suite_seq;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002634 asdl_seq *orelse = NULL;
2635 n_elif = NCH(n) - 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 /* must reference the child n_elif+1 since 'else' token is third,
2637 not fourth, child from the end. */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002638 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2639 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2640 has_else = 1;
2641 n_elif -= 3;
2642 }
2643 n_elif /= 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644
Thomas Wouters89f507f2006-12-13 04:49:30 +00002645 if (has_else) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00002646 asdl_seq *suite_seq2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647
Thomas Wouters89f507f2006-12-13 04:49:30 +00002648 orelse = asdl_seq_new(1, c->c_arena);
2649 if (!orelse)
2650 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002652 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002654 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2655 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002657 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2658 if (!suite_seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002660
Guido van Rossumd8faa362007-04-27 19:54:29 +00002661 asdl_seq_SET(orelse, 0,
2662 If(expression, suite_seq, suite_seq2,
2663 LINENO(CHILD(n, NCH(n) - 6)),
2664 CHILD(n, NCH(n) - 6)->n_col_offset,
2665 c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002666 /* the just-created orelse handled the last elif */
2667 n_elif--;
2668 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669
Thomas Wouters89f507f2006-12-13 04:49:30 +00002670 for (i = 0; i < n_elif; i++) {
2671 int off = 5 + (n_elif - i - 1) * 4;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002672 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2673 if (!newobj)
2674 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002676 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002679 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681
Thomas Wouters89f507f2006-12-13 04:49:30 +00002682 asdl_seq_SET(newobj, 0,
2683 If(expression, suite_seq, orelse,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002684 LINENO(CHILD(n, off)),
2685 CHILD(n, off)->n_col_offset, c->c_arena));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002686 orelse = newobj;
2687 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002688 expression = ast_for_expr(c, CHILD(n, 1));
2689 if (!expression)
2690 return NULL;
2691 suite_seq = ast_for_suite(c, CHILD(n, 3));
2692 if (!suite_seq)
2693 return NULL;
2694 return If(expression, suite_seq, orelse,
2695 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002697
2698 PyErr_Format(PyExc_SystemError,
2699 "unexpected token in 'if' statement: %s", s);
2700 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701}
2702
2703static stmt_ty
2704ast_for_while_stmt(struct compiling *c, const node *n)
2705{
2706 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2707 REQ(n, while_stmt);
2708
2709 if (NCH(n) == 4) {
2710 expr_ty expression;
2711 asdl_seq *suite_seq;
2712
2713 expression = ast_for_expr(c, CHILD(n, 1));
2714 if (!expression)
2715 return NULL;
2716 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002717 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002719 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 }
2721 else if (NCH(n) == 7) {
2722 expr_ty expression;
2723 asdl_seq *seq1, *seq2;
2724
2725 expression = ast_for_expr(c, CHILD(n, 1));
2726 if (!expression)
2727 return NULL;
2728 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002729 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 return NULL;
2731 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002732 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002733 return NULL;
2734
Thomas Wouters89f507f2006-12-13 04:49:30 +00002735 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002737
2738 PyErr_Format(PyExc_SystemError,
2739 "wrong number of tokens for 'while' statement: %d",
2740 NCH(n));
2741 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742}
2743
2744static stmt_ty
2745ast_for_for_stmt(struct compiling *c, const node *n)
2746{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002747 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002748 expr_ty expression;
2749 expr_ty target;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002750 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002751 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2752 REQ(n, for_stmt);
2753
2754 if (NCH(n) == 9) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002755 seq = ast_for_suite(c, CHILD(n, 8));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 if (!seq)
2757 return NULL;
2758 }
2759
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002760 node_target = CHILD(n, 1);
2761 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002762 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 /* Check the # of children rather than the length of _target, since
2765 for x, in ... has 1 element in _target, but still requires a Tuple. */
2766 if (NCH(node_target) == 1)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002767 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768 else
Thomas Wouters89f507f2006-12-13 04:49:30 +00002769 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002771 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002772 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773 return NULL;
2774 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002775 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776 return NULL;
2777
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002778 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2779 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002780}
2781
2782static excepthandler_ty
2783ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2784{
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002785 /* except_clause: 'except' [test ['as' test]] */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786 REQ(exc, except_clause);
2787 REQ(body, suite);
2788
2789 if (NCH(exc) == 1) {
2790 asdl_seq *suite_seq = ast_for_suite(c, body);
2791 if (!suite_seq)
2792 return NULL;
2793
Thomas Wouters89f507f2006-12-13 04:49:30 +00002794 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002795 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796 }
2797 else if (NCH(exc) == 2) {
2798 expr_ty expression;
2799 asdl_seq *suite_seq;
2800
2801 expression = ast_for_expr(c, CHILD(exc, 1));
2802 if (!expression)
2803 return NULL;
2804 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002805 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806 return NULL;
2807
Thomas Wouters89f507f2006-12-13 04:49:30 +00002808 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002809 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810 }
2811 else if (NCH(exc) == 4) {
2812 asdl_seq *suite_seq;
2813 expr_ty expression;
Guido van Rossum16be03e2007-01-10 18:51:35 +00002814 identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
Thomas Wouters89f507f2006-12-13 04:49:30 +00002815 if (!e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002818 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819 return NULL;
2820 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002821 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002822 return NULL;
2823
Thomas Wouters89f507f2006-12-13 04:49:30 +00002824 return excepthandler(expression, e, suite_seq, LINENO(exc),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002825 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002827
2828 PyErr_Format(PyExc_SystemError,
2829 "wrong number of children for 'except' clause: %d",
2830 NCH(exc));
2831 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832}
2833
2834static stmt_ty
2835ast_for_try_stmt(struct compiling *c, const node *n)
2836{
Neal Norwitzf599f422005-12-17 21:33:47 +00002837 const int nch = NCH(n);
2838 int n_except = (nch - 3)/3;
2839 asdl_seq *body, *orelse = NULL, *finally = NULL;
2840
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841 REQ(n, try_stmt);
2842
Neal Norwitzf599f422005-12-17 21:33:47 +00002843 body = ast_for_suite(c, CHILD(n, 2));
2844 if (body == NULL)
2845 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846
Neal Norwitzf599f422005-12-17 21:33:47 +00002847 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2848 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2849 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2850 /* we can assume it's an "else",
2851 because nch >= 9 for try-else-finally and
2852 it would otherwise have a type of except_clause */
2853 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2854 if (orelse == NULL)
2855 return NULL;
2856 n_except--;
2857 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858
Neal Norwitzf599f422005-12-17 21:33:47 +00002859 finally = ast_for_suite(c, CHILD(n, nch - 1));
2860 if (finally == NULL)
2861 return NULL;
2862 n_except--;
2863 }
2864 else {
2865 /* we can assume it's an "else",
2866 otherwise it would have a type of except_clause */
2867 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2868 if (orelse == NULL)
2869 return NULL;
2870 n_except--;
2871 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002873 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002874 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 return NULL;
2876 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002877
2878 if (n_except > 0) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002879 int i;
2880 stmt_ty except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002881 /* process except statements to create a try ... except */
2882 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2883 if (handlers == NULL)
2884 return NULL;
2885
2886 for (i = 0; i < n_except; i++) {
2887 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2888 CHILD(n, 5 + i * 3));
2889 if (!e)
2890 return NULL;
2891 asdl_seq_SET(handlers, i, e);
2892 }
2893
Thomas Wouters89f507f2006-12-13 04:49:30 +00002894 except_st = TryExcept(body, handlers, orelse, LINENO(n),
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002895 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002896 if (!finally)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002897 return except_st;
Neal Norwitzf599f422005-12-17 21:33:47 +00002898
2899 /* if a 'finally' is present too, we nest the TryExcept within a
2900 TryFinally to emulate try ... except ... finally */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002901 body = asdl_seq_new(1, c->c_arena);
2902 if (body == NULL)
2903 return NULL;
2904 asdl_seq_SET(body, 0, except_st);
Neal Norwitzf599f422005-12-17 21:33:47 +00002905 }
2906
2907 /* must be a try ... finally (except clauses are in body, if any exist) */
2908 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002909 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910}
2911
Guido van Rossumc2e20742006-02-27 22:32:47 +00002912static expr_ty
2913ast_for_with_var(struct compiling *c, const node *n)
2914{
2915 REQ(n, with_var);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002916 return ast_for_expr(c, CHILD(n, 1));
2917}
2918
2919/* with_stmt: 'with' test [ with_var ] ':' suite */
2920static stmt_ty
2921ast_for_with_stmt(struct compiling *c, const node *n)
2922{
2923 expr_ty context_expr, optional_vars = NULL;
2924 int suite_index = 3; /* skip 'with', test, and ':' */
2925 asdl_seq *suite_seq;
2926
2927 assert(TYPE(n) == with_stmt);
2928 context_expr = ast_for_expr(c, CHILD(n, 1));
2929 if (TYPE(CHILD(n, 2)) == with_var) {
2930 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2931
2932 if (!optional_vars) {
2933 return NULL;
2934 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00002935 if (!set_context(optional_vars, Store, n)) {
2936 return NULL;
2937 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002938 suite_index = 4;
2939 }
2940
2941 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2942 if (!suite_seq) {
2943 return NULL;
2944 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002945 return With(context_expr, optional_vars, suite_seq, LINENO(n),
Thomas Wouters89f507f2006-12-13 04:49:30 +00002946 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002947}
2948
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949static stmt_ty
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002950ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002951{
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002952 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
2953 asdl_seq *s;
2954 expr_ty call, dummy;
2955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 REQ(n, classdef);
2957
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002958 if (NCH(n) == 4) { /* class NAME ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002959 s = ast_for_suite(c, CHILD(n, 3));
2960 if (!s)
2961 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002962 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002963 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964 }
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002965
2966 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
Thomas Wouters89f507f2006-12-13 04:49:30 +00002967 s = ast_for_suite(c, CHILD(n,5));
2968 if (!s)
2969 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002970 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, NULL, NULL, NULL, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002971 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 }
2973
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002974 /* class NAME '(' arglist ')' ':' suite */
2975 /* build up a fake Call node so we can extract its pieces */
2976 dummy = Name(NEW_IDENTIFIER(CHILD(n, 1)), Load, LINENO(n), n->n_col_offset, c->c_arena);
2977 call = ast_for_call(c, CHILD(n, 3), dummy);
2978 if (!call)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002980 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002981 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002983
2984 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)),
2985 call->v.Call.args, call->v.Call.keywords,
2986 call->v.Call.starargs, call->v.Call.kwargs, s,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002987 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988}
2989
2990static stmt_ty
2991ast_for_stmt(struct compiling *c, const node *n)
2992{
2993 if (TYPE(n) == stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002994 assert(NCH(n) == 1);
2995 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 }
2997 if (TYPE(n) == simple_stmt) {
Thomas Wouters89f507f2006-12-13 04:49:30 +00002998 assert(num_stmts(n) == 1);
2999 n = CHILD(n, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 }
3001 if (TYPE(n) == small_stmt) {
Neal Norwitzc1505362006-12-28 06:47:50 +00003002 REQ(n, small_stmt);
3003 n = CHILD(n, 0);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003004 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
3005 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +00003006 */
3007 switch (TYPE(n)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 case expr_stmt:
3009 return ast_for_expr_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 case del_stmt:
3011 return ast_for_del_stmt(c, n);
3012 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003013 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003014 case flow_stmt:
3015 return ast_for_flow_stmt(c, n);
3016 case import_stmt:
3017 return ast_for_import_stmt(c, n);
3018 case global_stmt:
3019 return ast_for_global_stmt(c, n);
Jeremy Hylton81e95022007-02-27 06:50:52 +00003020 case nonlocal_stmt:
3021 return ast_for_nonlocal_stmt(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003022 case assert_stmt:
3023 return ast_for_assert_stmt(c, n);
3024 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003025 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3027 TYPE(n), NCH(n));
3028 return NULL;
3029 }
3030 }
3031 else {
3032 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003033 | funcdef | classdef | decorated
Thomas Wouters89f507f2006-12-13 04:49:30 +00003034 */
3035 node *ch = CHILD(n, 0);
3036 REQ(n, compound_stmt);
3037 switch (TYPE(ch)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003038 case if_stmt:
3039 return ast_for_if_stmt(c, ch);
3040 case while_stmt:
3041 return ast_for_while_stmt(c, ch);
3042 case for_stmt:
3043 return ast_for_for_stmt(c, ch);
3044 case try_stmt:
3045 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003046 case with_stmt:
3047 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 case funcdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003049 return ast_for_funcdef(c, ch, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050 case classdef:
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003051 return ast_for_classdef(c, ch, NULL);
3052 case decorated:
3053 return ast_for_decorated(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003054 default:
Neal Norwitz79792652005-11-14 04:25:03 +00003055 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056 "unhandled small_stmt: TYPE=%d NCH=%d\n",
3057 TYPE(n), NCH(n));
3058 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003059 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060 }
3061}
3062
3063static PyObject *
3064parsenumber(const char *s)
3065{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003066 const char *end;
3067 long x;
3068 double dx;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003070 Py_complex c;
3071 int imflag;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072#endif
3073
Guido van Rossumd8faa362007-04-27 19:54:29 +00003074 errno = 0;
3075 end = s + strlen(s) - 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003077 imflag = *end == 'j' || *end == 'J';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003079 if (s[0] == '0') {
3080 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3081 if (x < 0 && errno == 0) {
3082 return PyLong_FromString((char *)s,
3083 (char **)0,
3084 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003085 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003086 }
3087 else
3088 x = PyOS_strtol((char *)s, (char **)&end, 0);
3089 if (*end == '\0') {
3090 if (errno != 0)
3091 return PyLong_FromString((char *)s, (char **)0, 0);
Christian Heimes217cfd12007-12-02 14:31:20 +00003092 return PyLong_FromLong(x);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003093 }
3094 /* XXX Huge floats may silently fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003095#ifndef WITHOUT_COMPLEX
Guido van Rossumd8faa362007-04-27 19:54:29 +00003096 if (imflag) {
3097 c.real = 0.;
3098 PyFPE_START_PROTECT("atof", return 0)
3099 c.imag = PyOS_ascii_atof(s);
3100 PyFPE_END_PROTECT(c)
3101 return PyComplex_FromCComplex(c);
3102 }
3103 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003105 {
3106 PyFPE_START_PROTECT("atof", return 0)
3107 dx = PyOS_ascii_atof(s);
3108 PyFPE_END_PROTECT(dx)
3109 return PyFloat_FromDouble(dx);
3110 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111}
3112
3113static PyObject *
3114decode_utf8(const char **sPtr, const char *end, char* encoding)
3115{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003116 PyObject *u, *v;
3117 char *s, *t;
3118 t = s = (char *)*sPtr;
3119 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3120 while (s < end && (*s & 0x80)) s++;
3121 *sPtr = s;
3122 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3123 if (u == NULL)
3124 return NULL;
3125 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3126 Py_DECREF(u);
3127 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128}
3129
3130static PyObject *
3131decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3132{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003133 PyObject *v, *u;
3134 char *buf;
3135 char *p;
3136 const char *end;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003137
Guido van Rossumd8faa362007-04-27 19:54:29 +00003138 if (encoding == NULL) {
3139 buf = (char *)s;
3140 u = NULL;
3141 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3142 buf = (char *)s;
3143 u = NULL;
3144 } else {
3145 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3146 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3147 if (u == NULL)
3148 return NULL;
3149 p = buf = PyString_AsString(u);
3150 end = s + len;
3151 while (s < end) {
3152 if (*s == '\\') {
3153 *p++ = *s++;
3154 if (*s & 0x80) {
3155 strcpy(p, "u005c");
3156 p += 5;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003157 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003158 }
3159 if (*s & 0x80) { /* XXX inefficient */
3160 PyObject *w;
3161 char *r;
3162 Py_ssize_t rn, i;
3163 w = decode_utf8(&s, end, "utf-16-be");
3164 if (w == NULL) {
3165 Py_DECREF(u);
3166 return NULL;
3167 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00003168 r = PyString_AS_STRING(w);
Christian Heimes90aa7642007-12-19 02:45:37 +00003169 rn = Py_SIZE(w);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003170 assert(rn % 2 == 0);
3171 for (i = 0; i < rn; i += 2) {
3172 sprintf(p, "\\u%02x%02x",
3173 r[i + 0] & 0xFF,
3174 r[i + 1] & 0xFF);
3175 p += 6;
3176 }
3177 Py_DECREF(w);
3178 } else {
3179 *p++ = *s++;
3180 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003181 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003182 len = p - buf;
3183 s = buf;
3184 }
3185 if (rawmode)
3186 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3187 else
3188 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3189 Py_XDECREF(u);
3190 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191}
3192
3193/* s is a Python string literal, including the bracketing quote characters,
Guido van Rossum98297ee2007-11-06 21:34:58 +00003194 * and r &/or b prefixes (if any), and embedded escape sequences (if any).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195 * parsestr parses it, and returns the decoded Python string object.
3196 */
3197static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003198parsestr(const node *n, const char *encoding, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003200 size_t len;
3201 const char *s = STR(n);
3202 int quote = Py_CHARMASK(*s);
3203 int rawmode = 0;
3204 int need_encoding;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205
Guido van Rossum98297ee2007-11-06 21:34:58 +00003206 if (isalpha(quote)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003207 if (quote == 'b' || quote == 'B') {
3208 quote = *++s;
3209 *bytesmode = 1;
3210 }
3211 if (quote == 'r' || quote == 'R') {
3212 quote = *++s;
3213 rawmode = 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003214 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003215 }
3216 if (quote != '\'' && quote != '\"') {
3217 PyErr_BadInternalCall();
3218 return NULL;
3219 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003220 s++;
3221 len = strlen(s);
3222 if (len > INT_MAX) {
3223 PyErr_SetString(PyExc_OverflowError,
3224 "string to parse is too long");
3225 return NULL;
3226 }
3227 if (s[--len] != quote) {
3228 PyErr_BadInternalCall();
3229 return NULL;
3230 }
3231 if (len >= 4 && s[0] == quote && s[1] == quote) {
3232 s += 2;
3233 len -= 2;
3234 if (s[--len] != quote || s[--len] != quote) {
3235 PyErr_BadInternalCall();
3236 return NULL;
Thomas Wouters00e41de2007-02-23 19:56:57 +00003237 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003238 }
Guido van Rossum29fd7122007-11-12 01:13:56 +00003239 if (!*bytesmode && !rawmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240 return decode_unicode(s, len, rawmode, encoding);
3241 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003242 if (*bytesmode) {
3243 /* Disallow non-ascii characters (but not escapes) */
3244 const char *c;
3245 for (c = s; *c; c++) {
3246 if (Py_CHARMASK(*c) >= 0x80) {
3247 ast_error(n, "bytes can only contain ASCII "
3248 "literal characters.");
3249 return NULL;
3250 }
Thomas Wouters00e41de2007-02-23 19:56:57 +00003251 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003252 }
3253 need_encoding = (!*bytesmode && encoding != NULL &&
3254 strcmp(encoding, "utf-8") != 0 &&
3255 strcmp(encoding, "iso-8859-1") != 0);
3256 if (rawmode || strchr(s, '\\') == NULL) {
3257 if (need_encoding) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003258 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003259 if (u == NULL || !*bytesmode)
3260 return u;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003261 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3262 Py_DECREF(u);
3263 return v;
Guido van Rossum29fd7122007-11-12 01:13:56 +00003264 } else if (*bytesmode) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00003265 return PyString_FromStringAndSize(s, len);
Guido van Rossum29fd7122007-11-12 01:13:56 +00003266 } else if (strcmp(encoding, "utf-8") == 0) {
3267 return PyUnicode_FromStringAndSize(s, len);
3268 } else {
3269 return PyUnicode_DecodeLatin1(s, len, NULL);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003270 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003271 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272
Guido van Rossumbdde0112007-05-11 16:26:27 +00003273 return PyString_DecodeEscape(s, len, NULL, 1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00003274 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275}
3276
Guido van Rossum29fd7122007-11-12 01:13:56 +00003277/* Build a Python string object out of a STRING+ atom. This takes care of
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278 * compile-time literal catenation, calling parsestr() on each piece, and
3279 * pasting the intermediate results together.
3280 */
3281static PyObject *
Thomas Wouters00e41de2007-02-23 19:56:57 +00003282parsestrplus(struct compiling *c, const node *n, int *bytesmode)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283{
Guido van Rossumd8faa362007-04-27 19:54:29 +00003284 PyObject *v;
3285 int i;
3286 REQ(CHILD(n, 0), STRING);
3287 v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
3288 if (v != NULL) {
3289 /* String literal concatenation */
3290 for (i = 1; i < NCH(n); i++) {
3291 PyObject *s;
3292 int subbm = 0;
3293 s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
3294 if (s == NULL)
3295 goto onError;
3296 if (*bytesmode != subbm) {
Guido van Rossum29fd7122007-11-12 01:13:56 +00003297 ast_error(n, "cannot mix bytes and nonbytes literals");
Guido van Rossumd8faa362007-04-27 19:54:29 +00003298 goto onError;
3299 }
3300 if (PyString_Check(v) && PyString_Check(s)) {
3301 PyString_ConcatAndDel(&v, s);
3302 if (v == NULL)
3303 goto onError;
3304 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003305 else {
3306 PyObject *temp = PyUnicode_Concat(v, s);
3307 Py_DECREF(s);
3308 Py_DECREF(v);
3309 v = temp;
3310 if (v == NULL)
3311 goto onError;
3312 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003313 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003314 }
3315 return v;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003316
Guido van Rossumd8faa362007-04-27 19:54:29 +00003317 onError:
3318 Py_XDECREF(v);
3319 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}