blob: 4d0b991c2cf34b4b9271e57862afefbb81dff1cd [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/* XXX TO DO
19 - re-indent this file (should be done)
20 - internal error checking (freeing memory, etc.)
21 - syntax errors
22*/
23
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000024/* Data structure used internally */
25struct compiling {
Neal Norwitzadb69fc2005-12-17 20:54:49 +000026 char *c_encoding; /* source encoding */
27 PyArena *c_arena; /* arena for allocating memeory */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028};
29
30static asdl_seq *seq_for_testlist(struct compiling *, const node *);
31static expr_ty ast_for_expr(struct compiling *, const node *);
32static stmt_ty ast_for_stmt(struct compiling *, const node *);
33static asdl_seq *ast_for_suite(struct compiling *, const node *);
Martin v. Löwis28457502006-04-11 09:17:27 +000034static asdl_seq *ast_for_exprlist(struct compiling *, const node *, expr_context_ty);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +000035static expr_ty ast_for_testlist(struct compiling *, const node *);
36static expr_ty ast_for_testlist_gexp(struct compiling *, const node *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037
38/* Note different signature for ast_for_call */
39static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
40
41static PyObject *parsenumber(const char *);
42static PyObject *parsestr(const char *s, const char *encoding);
43static PyObject *parsestrplus(struct compiling *, const node *n);
44
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045#ifndef LINENO
46#define LINENO(n) ((n)->n_lineno)
47#endif
48
Neal Norwitzadb69fc2005-12-17 20:54:49 +000049static identifier
50new_identifier(const char* n, PyArena *arena) {
51 PyObject* id = PyString_InternFromString(n);
52 PyArena_AddPyObject(arena, id);
53 return id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000054}
55
Neal Norwitzadb69fc2005-12-17 20:54:49 +000056#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057
58/* This routine provides an invalid object for the syntax error.
59 The outermost routine must unpack this error and create the
60 proper object. We do this so that we don't have to pass
61 the filename to everything function.
62
63 XXX Maybe we should just pass the filename...
64*/
65
66static int
67ast_error(const node *n, const char *errstr)
68{
69 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
70 if (!u)
71 return 0;
72 PyErr_SetObject(PyExc_SyntaxError, u);
73 Py_DECREF(u);
74 return 0;
75}
76
77static void
78ast_error_finish(const char *filename)
79{
80 PyObject *type, *value, *tback, *errstr, *loc, *tmp;
Neal Norwitz46b7bda2006-01-08 01:06:06 +000081 long lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082
83 assert(PyErr_Occurred());
84 if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
85 return;
86
87 PyErr_Fetch(&type, &value, &tback);
88 errstr = PyTuple_GetItem(value, 0);
89 if (!errstr)
90 return;
91 Py_INCREF(errstr);
92 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000093 if (lineno == -1) {
94 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +000096 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097 Py_DECREF(value);
98
99 loc = PyErr_ProgramText(filename, lineno);
100 if (!loc) {
101 Py_INCREF(Py_None);
102 loc = Py_None;
103 }
Neal Norwitz46b7bda2006-01-08 01:06:06 +0000104 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105 Py_DECREF(loc);
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000106 if (!tmp) {
107 Py_DECREF(errstr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108 return;
Neal Norwitz8ad64aa2005-12-11 20:08:33 +0000109 }
Georg Brandl7784f122006-05-26 20:04:44 +0000110 value = PyTuple_Pack(2, errstr, tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111 Py_DECREF(errstr);
112 Py_DECREF(tmp);
113 if (!value)
114 return;
115 PyErr_Restore(type, value, tback);
116}
117
118/* num_stmts() returns number of contained statements.
119
120 Use this routine to determine how big a sequence is needed for
121 the statements in a parse tree. Its raison d'etre is this bit of
122 grammar:
123
124 stmt: simple_stmt | compound_stmt
125 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
126
127 A simple_stmt can contain multiple small_stmt elements joined
128 by semicolons. If the arg is a simple_stmt, the number of
129 small_stmt elements is returned.
130*/
131
132static int
133num_stmts(const node *n)
134{
135 int i, l;
136 node *ch;
137
138 switch (TYPE(n)) {
139 case single_input:
140 if (TYPE(CHILD(n, 0)) == NEWLINE)
141 return 0;
142 else
143 return num_stmts(CHILD(n, 0));
144 case file_input:
145 l = 0;
146 for (i = 0; i < NCH(n); i++) {
147 ch = CHILD(n, i);
148 if (TYPE(ch) == stmt)
149 l += num_stmts(ch);
150 }
151 return l;
152 case stmt:
153 return num_stmts(CHILD(n, 0));
154 case compound_stmt:
155 return 1;
156 case simple_stmt:
157 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
158 case suite:
159 if (NCH(n) == 1)
160 return num_stmts(CHILD(n, 0));
161 else {
162 l = 0;
163 for (i = 2; i < (NCH(n) - 1); i++)
164 l += num_stmts(CHILD(n, i));
165 return l;
166 }
167 default: {
168 char buf[128];
169
170 sprintf(buf, "Non-statement found: %d %d\n",
171 TYPE(n), NCH(n));
172 Py_FatalError(buf);
173 }
174 }
175 assert(0);
176 return 0;
177}
178
179/* Transform the CST rooted at node * to the appropriate AST
180*/
181
182mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000183PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
184 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185{
Jeremy Hyltona8293132006-02-28 17:58:27 +0000186 int i, j, k, num;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 asdl_seq *stmts = NULL;
188 stmt_ty s;
189 node *ch;
190 struct compiling c;
191
192 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000193 c.c_encoding = "utf-8";
Neal Norwitze98ccf62006-03-23 05:39:47 +0000194 if (TYPE(n) == encoding_decl) {
195 ast_error(n, "encoding declaration in Unicode string");
196 goto error;
197 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 } else if (TYPE(n) == encoding_decl) {
199 c.c_encoding = STR(n);
200 n = CHILD(n, 0);
201 } else {
202 c.c_encoding = NULL;
203 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000204 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltona8293132006-02-28 17:58:27 +0000206 k = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207 switch (TYPE(n)) {
208 case file_input:
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000209 stmts = asdl_seq_new(num_stmts(n), arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210 if (!stmts)
211 return NULL;
212 for (i = 0; i < NCH(n) - 1; i++) {
213 ch = CHILD(n, i);
214 if (TYPE(ch) == NEWLINE)
215 continue;
216 REQ(ch, stmt);
217 num = num_stmts(ch);
218 if (num == 1) {
219 s = ast_for_stmt(&c, ch);
220 if (!s)
221 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000222 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000223 }
224 else {
225 ch = CHILD(ch, 0);
226 REQ(ch, simple_stmt);
227 for (j = 0; j < num; j++) {
228 s = ast_for_stmt(&c, CHILD(ch, j * 2));
229 if (!s)
230 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000231 asdl_seq_SET(stmts, k++, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232 }
233 }
234 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000235 return Module(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236 case eval_input: {
237 expr_ty testlist_ast;
238
239 /* XXX Why not gen_for here? */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000240 testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 if (!testlist_ast)
242 goto error;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243 return Expression(testlist_ast, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244 }
245 case single_input:
246 if (TYPE(CHILD(n, 0)) == NEWLINE) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247 stmts = asdl_seq_new(1, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000248 if (!stmts)
249 goto error;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000250 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
251 arena));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000252 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253 }
254 else {
255 n = CHILD(n, 0);
256 num = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000257 stmts = asdl_seq_new(num, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258 if (!stmts)
259 goto error;
260 if (num == 1) {
Neal Norwitz406c6402006-01-07 21:23:26 +0000261 s = ast_for_stmt(&c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262 if (!s)
263 goto error;
264 asdl_seq_SET(stmts, 0, s);
265 }
266 else {
267 /* Only a simple_stmt can contain multiple statements. */
268 REQ(n, simple_stmt);
269 for (i = 0; i < NCH(n); i += 2) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (TYPE(CHILD(n, i)) == NEWLINE)
271 break;
272 s = ast_for_stmt(&c, CHILD(n, i));
273 if (!s)
274 goto error;
275 asdl_seq_SET(stmts, i / 2, s);
276 }
277 }
278
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000279 return Interactive(stmts, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000280 }
281 default:
282 goto error;
283 }
284 error:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 ast_error_finish(filename);
286 return NULL;
287}
288
289/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
290*/
291
292static operator_ty
293get_operator(const node *n)
294{
295 switch (TYPE(n)) {
296 case VBAR:
297 return BitOr;
298 case CIRCUMFLEX:
299 return BitXor;
300 case AMPER:
301 return BitAnd;
302 case LEFTSHIFT:
303 return LShift;
304 case RIGHTSHIFT:
305 return RShift;
306 case PLUS:
307 return Add;
308 case MINUS:
309 return Sub;
310 case STAR:
311 return Mult;
312 case SLASH:
313 return Div;
314 case DOUBLESLASH:
315 return FloorDiv;
316 case PERCENT:
317 return Mod;
318 default:
Martin v. Löwis28457502006-04-11 09:17:27 +0000319 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320 }
321}
322
Jeremy Hyltona8293132006-02-28 17:58:27 +0000323/* Set the context ctx for expr_ty e, recursively traversing e.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324
325 Only sets context for expr kinds that "can appear in assignment context"
326 (according to ../Parser/Python.asdl). For other expr kinds, it sets
327 an appropriate syntax error and returns false.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328*/
329
330static int
331set_context(expr_ty e, expr_context_ty ctx, const node *n)
332{
333 asdl_seq *s = NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000334 /* If a particular expression type can't be used for assign / delete,
335 set expr_name to its name and an error message will be generated.
336 */
337 const char* expr_name = NULL;
338
339 /* The ast defines augmented store and load contexts, but the
340 implementation here doesn't actually use them. The code may be
341 a little more complex than necessary as a result. It also means
Neil Schemenauer0e07b602006-07-09 16:16:34 +0000342 that expressions in an augmented assignment have a Store context.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000343 Consider restructuring so that augmented assignment uses
Guido van Rossumc2e20742006-02-27 22:32:47 +0000344 set_context(), too.
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000345 */
346 assert(ctx != AugStore && ctx != AugLoad);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347
348 switch (e->kind) {
349 case Attribute_kind:
350 if (ctx == Store &&
Jeremy Hyltona8293132006-02-28 17:58:27 +0000351 !strcmp(PyString_AS_STRING(e->v.Attribute.attr), "None")) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352 return ast_error(n, "assignment to None");
353 }
354 e->v.Attribute.ctx = ctx;
355 break;
356 case Subscript_kind:
357 e->v.Subscript.ctx = ctx;
358 break;
359 case Name_kind:
360 if (ctx == Store &&
361 !strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
362 return ast_error(n, "assignment to None");
363 }
364 e->v.Name.ctx = ctx;
365 break;
366 case List_kind:
367 e->v.List.ctx = ctx;
368 s = e->v.List.elts;
369 break;
370 case Tuple_kind:
371 if (asdl_seq_LEN(e->v.Tuple.elts) == 0)
372 return ast_error(n, "can't assign to ()");
373 e->v.Tuple.ctx = ctx;
374 s = e->v.Tuple.elts;
375 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000376 case Lambda_kind:
377 expr_name = "lambda";
378 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000379 case Call_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000380 expr_name = "function call";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000382 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 case BinOp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000384 case UnaryOp_kind:
385 expr_name = "operator";
386 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000387 case GeneratorExp_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000388 expr_name = "generator expression";
389 break;
Neal Norwitz0d62a062006-07-30 06:53:31 +0000390 case Yield_kind:
391 expr_name = "yield expression";
392 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000393 case ListComp_kind:
394 expr_name = "list comprehension";
395 break;
396 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000397 case Num_kind:
398 case Str_kind:
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000399 expr_name = "literal";
400 break;
401 case Compare_kind:
402 expr_name = "comparison";
403 break;
404 case Repr_kind:
405 expr_name = "repr";
406 break;
Neal Norwitz373f0a72006-05-15 07:04:36 +0000407 case IfExp_kind:
408 expr_name = "conditional expression";
409 break;
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000410 default:
411 PyErr_Format(PyExc_SystemError,
412 "unexpected expression in assignment %d (line %d)",
413 e->kind, e->lineno);
414 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415 }
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000416 /* Check for error string set by switch */
417 if (expr_name) {
418 char buf[300];
419 PyOS_snprintf(buf, sizeof(buf),
420 "can't %s %s",
421 ctx == Store ? "assign to" : "delete",
422 expr_name);
423 return ast_error(n, buf);
424 }
425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000426 /* If the LHS is a list or tuple, we need to set the assignment
Jeremy Hyltona8293132006-02-28 17:58:27 +0000427 context for all the contained elements.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428 */
429 if (s) {
430 int i;
431
432 for (i = 0; i < asdl_seq_LEN(s); i++) {
Martin v. Löwis28457502006-04-11 09:17:27 +0000433 if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000434 return 0;
435 }
436 }
437 return 1;
438}
439
440static operator_ty
441ast_for_augassign(const node *n)
442{
443 REQ(n, augassign);
444 n = CHILD(n, 0);
445 switch (STR(n)[0]) {
446 case '+':
447 return Add;
448 case '-':
449 return Sub;
450 case '/':
451 if (STR(n)[1] == '/')
452 return FloorDiv;
453 else
454 return Div;
455 case '%':
456 return Mod;
457 case '<':
458 return LShift;
459 case '>':
460 return RShift;
461 case '&':
462 return BitAnd;
463 case '^':
464 return BitXor;
465 case '|':
466 return BitOr;
467 case '*':
468 if (STR(n)[1] == '*')
469 return Pow;
470 else
471 return Mult;
472 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000473 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000474 return (operator_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475 }
476}
477
478static cmpop_ty
479ast_for_comp_op(const node *n)
480{
481 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
482 |'is' 'not'
483 */
484 REQ(n, comp_op);
485 if (NCH(n) == 1) {
486 n = CHILD(n, 0);
487 switch (TYPE(n)) {
488 case LESS:
489 return Lt;
490 case GREATER:
491 return Gt;
492 case EQEQUAL: /* == */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493 return Eq;
494 case LESSEQUAL:
495 return LtE;
496 case GREATEREQUAL:
497 return GtE;
498 case NOTEQUAL:
499 return NotEq;
500 case NAME:
501 if (strcmp(STR(n), "in") == 0)
502 return In;
503 if (strcmp(STR(n), "is") == 0)
504 return Is;
505 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000506 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507 STR(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000508 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509 }
510 }
511 else if (NCH(n) == 2) {
512 /* handle "not in" and "is not" */
513 switch (TYPE(CHILD(n, 0))) {
514 case NAME:
515 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
516 return NotIn;
517 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
518 return IsNot;
519 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000520 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000521 STR(CHILD(n, 0)), STR(CHILD(n, 1)));
Martin v. Löwis28457502006-04-11 09:17:27 +0000522 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523 }
524 }
Neal Norwitz79792652005-11-14 04:25:03 +0000525 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526 NCH(n));
Martin v. Löwis28457502006-04-11 09:17:27 +0000527 return (cmpop_ty)0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000528}
529
530static asdl_seq *
531seq_for_testlist(struct compiling *c, const node *n)
532{
533 /* testlist: test (',' test)* [','] */
Armin Rigo31441302005-10-21 12:57:31 +0000534 asdl_seq *seq;
535 expr_ty expression;
536 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537 assert(TYPE(n) == testlist
538 || TYPE(n) == listmaker
539 || TYPE(n) == testlist_gexp
540 || TYPE(n) == testlist_safe
541 );
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000543 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000544 if (!seq)
545 return NULL;
546
547 for (i = 0; i < NCH(n); i += 2) {
Thomas Woutersfa443cd2006-02-27 15:43:57 +0000548 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000549
550 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000551 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553
554 assert(i / 2 < seq->size);
555 asdl_seq_SET(seq, i / 2, expression);
556 }
557 return seq;
558}
559
560static expr_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000561compiler_complex_args(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562{
563 int i, len = (NCH(n) + 1) / 2;
564 expr_ty result;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000565 asdl_seq *args = asdl_seq_new(len, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000566 if (!args)
567 return NULL;
568
569 REQ(n, fplist);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570 for (i = 0; i < len; i++) {
571 const node *child = CHILD(CHILD(n, 2*i), 0);
572 expr_ty arg;
573 if (TYPE(child) == NAME) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000574 if (!strcmp(STR(child), "None")) {
575 ast_error(child, "assignment to None");
576 return NULL;
577 }
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000578 arg = Name(NEW_IDENTIFIER(child), Store, LINENO(child),
579 child->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000580 }
581 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000582 arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
Jeremy Hyltona8293132006-02-28 17:58:27 +0000583 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584 asdl_seq_SET(args, i, arg);
585 }
586
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000587 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltona8293132006-02-28 17:58:27 +0000588 if (!set_context(result, Store, n))
589 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590 return result;
591}
592
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593
Jeremy Hyltona8293132006-02-28 17:58:27 +0000594/* Create AST for argument list. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595
596static arguments_ty
597ast_for_arguments(struct compiling *c, const node *n)
598{
599 /* parameters: '(' [varargslist] ')'
600 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
601 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
602 */
Jeremy Hyltona8293132006-02-28 17:58:27 +0000603 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000604 asdl_seq *args, *defaults;
605 identifier vararg = NULL, kwarg = NULL;
606 node *ch;
607
608 if (TYPE(n) == parameters) {
609 if (NCH(n) == 2) /* () as argument list */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000610 return arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 n = CHILD(n, 1);
612 }
613 REQ(n, varargslist);
614
615 /* first count the number of normal args & defaults */
616 for (i = 0; i < NCH(n); i++) {
617 ch = CHILD(n, i);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000618 if (TYPE(ch) == fpdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 n_args++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 if (TYPE(ch) == EQUAL)
621 n_defaults++;
622 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000623 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624 if (!args && n_args)
Neal Norwitzc173b482006-07-30 19:18:13 +0000625 return NULL; /* Don't need to goto error; no objects allocated */
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000626 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000627 if (!defaults && n_defaults)
Neal Norwitzc173b482006-07-30 19:18:13 +0000628 return NULL; /* Don't need to goto error; no objects allocated */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629
630 /* fpdef: NAME | '(' fplist ')'
631 fplist: fpdef (',' fpdef)* [',']
632 */
633 i = 0;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000634 j = 0; /* index for defaults */
635 k = 0; /* index for args */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636 while (i < NCH(n)) {
637 ch = CHILD(n, i);
638 switch (TYPE(ch)) {
639 case fpdef:
640 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
641 anything other than EQUAL or a comma? */
642 /* XXX Should NCH(n) check be made a separate check? */
643 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
Neal Norwitzd12bd012006-07-21 07:59:47 +0000644 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
645 if (!expression)
646 goto error;
Neal Norwitzc173b482006-07-30 19:18:13 +0000647 assert(defaults != NULL);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000648 asdl_seq_SET(defaults, j++, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649 i += 2;
650 found_default = 1;
651 }
652 else if (found_default) {
653 ast_error(n,
654 "non-default argument follows default argument");
655 goto error;
656 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657 if (NCH(ch) == 3) {
Neal Norwitz33b730e2006-03-27 08:58:23 +0000658 ch = CHILD(ch, 1);
659 /* def foo((x)): is not complex, special case. */
660 if (NCH(ch) != 1) {
661 /* We have complex arguments, setup for unpacking. */
662 asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
663 } else {
664 /* def foo((x)): setup for checking NAME below. */
665 ch = CHILD(ch, 0);
666 }
667 }
668 if (TYPE(CHILD(ch, 0)) == NAME) {
Armin Rigo31441302005-10-21 12:57:31 +0000669 expr_ty name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670 if (!strcmp(STR(CHILD(ch, 0)), "None")) {
671 ast_error(CHILD(ch, 0), "assignment to None");
672 goto error;
673 }
Armin Rigo31441302005-10-21 12:57:31 +0000674 name = Name(NEW_IDENTIFIER(CHILD(ch, 0)),
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000675 Param, LINENO(ch), ch->n_col_offset,
676 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677 if (!name)
678 goto error;
Jeremy Hyltona8293132006-02-28 17:58:27 +0000679 asdl_seq_SET(args, k++, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680
681 }
682 i += 2; /* the name and the comma */
683 break;
684 case STAR:
685 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
686 ast_error(CHILD(n, i+1), "assignment to None");
687 goto error;
688 }
689 vararg = NEW_IDENTIFIER(CHILD(n, i+1));
690 i += 3;
691 break;
692 case DOUBLESTAR:
693 if (!strcmp(STR(CHILD(n, i+1)), "None")) {
694 ast_error(CHILD(n, i+1), "assignment to None");
695 goto error;
696 }
697 kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
698 i += 3;
699 break;
700 default:
Neal Norwitz79792652005-11-14 04:25:03 +0000701 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000702 "unexpected node in varargslist: %d @ %d",
703 TYPE(ch), i);
704 goto error;
705 }
706 }
707
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000708 return arguments(args, vararg, kwarg, defaults, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000709
710 error:
Neal Norwitze76adcd2005-11-15 05:04:31 +0000711 Py_XDECREF(vararg);
712 Py_XDECREF(kwarg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000713 return NULL;
714}
715
716static expr_ty
717ast_for_dotted_name(struct compiling *c, const node *n)
718{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000719 expr_ty e;
720 identifier id;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000721 int lineno, col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722 int i;
723
724 REQ(n, dotted_name);
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000725
726 lineno = LINENO(n);
727 col_offset = n->n_col_offset;
728
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729 id = NEW_IDENTIFIER(CHILD(n, 0));
730 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000731 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000732 e = Name(id, Load, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000734 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
736 for (i = 2; i < NCH(n); i+=2) {
737 id = NEW_IDENTIFIER(CHILD(n, i));
738 if (!id)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000739 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000740 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +0000741 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000742 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000743 }
744
745 return e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000746}
747
748static expr_ty
749ast_for_decorator(struct compiling *c, const node *n)
750{
751 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
752 expr_ty d = NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +0000753 expr_ty name_expr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754
755 REQ(n, decorator);
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000756 REQ(CHILD(n, 0), AT);
757 REQ(RCHILD(n, -1), NEWLINE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
759 name_expr = ast_for_dotted_name(c, CHILD(n, 1));
760 if (!name_expr)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000761 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762
763 if (NCH(n) == 3) { /* No arguments */
764 d = name_expr;
765 name_expr = NULL;
766 }
767 else if (NCH(n) == 5) { /* Call with no arguments */
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000768 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
769 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000771 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772 name_expr = NULL;
773 }
774 else {
775 d = ast_for_call(c, CHILD(n, 3), name_expr);
776 if (!d)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000777 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000778 name_expr = NULL;
779 }
780
781 return d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782}
783
784static asdl_seq*
785ast_for_decorators(struct compiling *c, const node *n)
786{
Neal Norwitz84456bd2005-12-18 03:16:20 +0000787 asdl_seq* decorator_seq;
Neal Norwitze76adcd2005-11-15 05:04:31 +0000788 expr_ty d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789 int i;
790
791 REQ(n, decorators);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000792 decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793 if (!decorator_seq)
794 return NULL;
795
796 for (i = 0; i < NCH(n); i++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +0000797 d = ast_for_decorator(c, CHILD(n, i));
798 if (!d)
799 return NULL;
800 asdl_seq_SET(decorator_seq, i, d);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801 }
802 return decorator_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803}
804
805static stmt_ty
806ast_for_funcdef(struct compiling *c, const node *n)
807{
808 /* funcdef: 'def' [decorators] NAME parameters ':' suite */
Neal Norwitz84456bd2005-12-18 03:16:20 +0000809 identifier name;
810 arguments_ty args;
811 asdl_seq *body;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000812 asdl_seq *decorator_seq = NULL;
813 int name_i;
814
815 REQ(n, funcdef);
816
817 if (NCH(n) == 6) { /* decorators are present */
818 decorator_seq = ast_for_decorators(c, CHILD(n, 0));
819 if (!decorator_seq)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000820 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000821 name_i = 2;
822 }
823 else {
824 name_i = 1;
825 }
826
827 name = NEW_IDENTIFIER(CHILD(n, name_i));
828 if (!name)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000829 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000830 else if (!strcmp(STR(CHILD(n, name_i)), "None")) {
Neal Norwitze76adcd2005-11-15 05:04:31 +0000831 ast_error(CHILD(n, name_i), "assignment to None");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000832 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000833 }
834 args = ast_for_arguments(c, CHILD(n, name_i + 1));
835 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000836 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837 body = ast_for_suite(c, CHILD(n, name_i + 3));
838 if (!body)
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000839 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000840
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000841 return FunctionDef(name, args, body, decorator_seq, LINENO(n),
842 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843}
844
845static expr_ty
846ast_for_lambdef(struct compiling *c, const node *n)
847{
848 /* lambdef: 'lambda' [varargslist] ':' test */
849 arguments_ty args;
850 expr_ty expression;
851
852 if (NCH(n) == 3) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000853 args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854 if (!args)
855 return NULL;
856 expression = ast_for_expr(c, CHILD(n, 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000857 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859 }
860 else {
861 args = ast_for_arguments(c, CHILD(n, 1));
862 if (!args)
863 return NULL;
864 expression = ast_for_expr(c, CHILD(n, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000865 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000866 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000867 }
868
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000869 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000870}
871
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000872static expr_ty
873ast_for_ifexpr(struct compiling *c, const node *n)
874{
875 /* test: or_test 'if' or_test 'else' test */
876 expr_ty expression, body, orelse;
877
Thomas Woutersaa8b6c52006-02-27 16:46:22 +0000878 assert(NCH(n) == 5);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000879 body = ast_for_expr(c, CHILD(n, 0));
880 if (!body)
881 return NULL;
882 expression = ast_for_expr(c, CHILD(n, 2));
883 if (!expression)
884 return NULL;
885 orelse = ast_for_expr(c, CHILD(n, 4));
886 if (!orelse)
887 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +0000888 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
889 c->c_arena);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000890}
891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892/* Count the number of 'for' loop in a list comprehension.
893
894 Helper for ast_for_listcomp().
895*/
896
897static int
898count_list_fors(const node *n)
899{
900 int n_fors = 0;
901 node *ch = CHILD(n, 1);
902
903 count_list_for:
904 n_fors++;
905 REQ(ch, list_for);
906 if (NCH(ch) == 5)
907 ch = CHILD(ch, 4);
908 else
909 return n_fors;
910 count_list_iter:
911 REQ(ch, list_iter);
912 ch = CHILD(ch, 0);
913 if (TYPE(ch) == list_for)
914 goto count_list_for;
915 else if (TYPE(ch) == list_if) {
916 if (NCH(ch) == 3) {
917 ch = CHILD(ch, 2);
918 goto count_list_iter;
919 }
920 else
921 return n_fors;
922 }
Neal Norwitz84456bd2005-12-18 03:16:20 +0000923
924 /* Should never be reached */
925 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
926 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000927}
928
929/* Count the number of 'if' statements in a list comprehension.
930
931 Helper for ast_for_listcomp().
932*/
933
934static int
935count_list_ifs(const node *n)
936{
937 int n_ifs = 0;
938
939 count_list_iter:
940 REQ(n, list_iter);
941 if (TYPE(CHILD(n, 0)) == list_for)
942 return n_ifs;
943 n = CHILD(n, 0);
944 REQ(n, list_if);
945 n_ifs++;
946 if (NCH(n) == 2)
947 return n_ifs;
948 n = CHILD(n, 2);
949 goto count_list_iter;
950}
951
952static expr_ty
953ast_for_listcomp(struct compiling *c, const node *n)
954{
955 /* listmaker: test ( list_for | (',' test)* [','] )
956 list_for: 'for' exprlist 'in' testlist_safe [list_iter]
957 list_iter: list_for | list_if
958 list_if: 'if' test [list_iter]
959 testlist_safe: test [(',' test)+ [',']]
960 */
961 expr_ty elt;
962 asdl_seq *listcomps;
963 int i, n_fors;
964 node *ch;
965
966 REQ(n, listmaker);
967 assert(NCH(n) > 1);
968
969 elt = ast_for_expr(c, CHILD(n, 0));
970 if (!elt)
971 return NULL;
972
973 n_fors = count_list_fors(n);
974 if (n_fors == -1)
975 return NULL;
976
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000977 listcomps = asdl_seq_new(n_fors, c->c_arena);
978 if (!listcomps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000979 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000980
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000981 ch = CHILD(n, 1);
982 for (i = 0; i < n_fors; i++) {
983 comprehension_ty lc;
984 asdl_seq *t;
985 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +0000986 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987
988 REQ(ch, list_for);
989
Neal Norwitz3b3aae02006-09-05 03:56:01 +0000990 for_ch = CHILD(ch, 1);
991 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000992 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000993 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +0000994 expression = ast_for_testlist(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000995 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997
Neal Norwitz3b3aae02006-09-05 03:56:01 +0000998 /* Check the # of children rather than the length of t, since
999 [x for x, in ... ] has 1 element in t, but still requires a Tuple. */
1000 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001001 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001002 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001004 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1005 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001006 expression, NULL, c->c_arena);
1007 if (!lc)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009
1010 if (NCH(ch) == 5) {
1011 int j, n_ifs;
1012 asdl_seq *ifs;
1013
1014 ch = CHILD(ch, 4);
1015 n_ifs = count_list_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001016 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001018
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001019 ifs = asdl_seq_new(n_ifs, c->c_arena);
1020 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022
1023 for (j = 0; j < n_ifs; j++) {
Jeremy Hyltona8293132006-02-28 17:58:27 +00001024 REQ(ch, list_iter);
1025 ch = CHILD(ch, 0);
1026 REQ(ch, list_if);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027
Jeremy Hyltona8293132006-02-28 17:58:27 +00001028 asdl_seq_SET(ifs, j, ast_for_expr(c, CHILD(ch, 1)));
1029 if (NCH(ch) == 3)
1030 ch = CHILD(ch, 2);
1031 }
1032 /* on exit, must guarantee that ch is a list_for */
1033 if (TYPE(ch) == list_iter)
1034 ch = CHILD(ch, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035 lc->ifs = ifs;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001036 }
1037 asdl_seq_SET(listcomps, i, lc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038 }
1039
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001040 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001041}
1042
1043/*
1044 Count the number of 'for' loops in a generator expression.
1045
1046 Helper for ast_for_genexp().
1047*/
1048
1049static int
1050count_gen_fors(const node *n)
1051{
1052 int n_fors = 0;
1053 node *ch = CHILD(n, 1);
1054
1055 count_gen_for:
1056 n_fors++;
1057 REQ(ch, gen_for);
1058 if (NCH(ch) == 5)
1059 ch = CHILD(ch, 4);
1060 else
1061 return n_fors;
1062 count_gen_iter:
1063 REQ(ch, gen_iter);
1064 ch = CHILD(ch, 0);
1065 if (TYPE(ch) == gen_for)
1066 goto count_gen_for;
1067 else if (TYPE(ch) == gen_if) {
1068 if (NCH(ch) == 3) {
1069 ch = CHILD(ch, 2);
1070 goto count_gen_iter;
1071 }
1072 else
1073 return n_fors;
1074 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001075
1076 /* Should never be reached */
1077 PyErr_SetString(PyExc_SystemError,
1078 "logic error in count_gen_fors");
1079 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001080}
1081
1082/* Count the number of 'if' statements in a generator expression.
1083
1084 Helper for ast_for_genexp().
1085*/
1086
1087static int
1088count_gen_ifs(const node *n)
1089{
1090 int n_ifs = 0;
1091
1092 while (1) {
1093 REQ(n, gen_iter);
1094 if (TYPE(CHILD(n, 0)) == gen_for)
1095 return n_ifs;
1096 n = CHILD(n, 0);
1097 REQ(n, gen_if);
1098 n_ifs++;
1099 if (NCH(n) == 2)
1100 return n_ifs;
1101 n = CHILD(n, 2);
1102 }
1103}
1104
Jeremy Hyltona8293132006-02-28 17:58:27 +00001105/* TODO(jhylton): Combine with list comprehension code? */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106static expr_ty
1107ast_for_genexp(struct compiling *c, const node *n)
1108{
1109 /* testlist_gexp: test ( gen_for | (',' test)* [','] )
1110 argument: [test '='] test [gen_for] # Really [keyword '='] test */
1111 expr_ty elt;
1112 asdl_seq *genexps;
1113 int i, n_fors;
1114 node *ch;
1115
1116 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument));
1117 assert(NCH(n) > 1);
1118
1119 elt = ast_for_expr(c, CHILD(n, 0));
1120 if (!elt)
1121 return NULL;
1122
1123 n_fors = count_gen_fors(n);
1124 if (n_fors == -1)
1125 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001126
1127 genexps = asdl_seq_new(n_fors, c->c_arena);
1128 if (!genexps)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001129 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001130
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131 ch = CHILD(n, 1);
1132 for (i = 0; i < n_fors; i++) {
1133 comprehension_ty ge;
1134 asdl_seq *t;
1135 expr_ty expression;
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001136 node *for_ch;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137
1138 REQ(ch, gen_for);
1139
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001140 for_ch = CHILD(ch, 1);
1141 t = ast_for_exprlist(c, for_ch, Store);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001142 if (!t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001143 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001144 expression = ast_for_expr(c, CHILD(ch, 3));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001145 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001147
Neal Norwitz3b3aae02006-09-05 03:56:01 +00001148 /* Check the # of children rather than the length of t, since
1149 (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1150 if (NCH(for_ch) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00001151 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001152 NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 else
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001154 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset,
1155 c->c_arena),
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001156 expression, NULL, c->c_arena);
1157
1158 if (!ge)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001160
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 if (NCH(ch) == 5) {
1162 int j, n_ifs;
1163 asdl_seq *ifs;
1164
1165 ch = CHILD(ch, 4);
1166 n_ifs = count_gen_ifs(ch);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001167 if (n_ifs == -1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001169
1170 ifs = asdl_seq_new(n_ifs, c->c_arena);
1171 if (!ifs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001173
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 for (j = 0; j < n_ifs; j++) {
1175 REQ(ch, gen_iter);
1176 ch = CHILD(ch, 0);
1177 REQ(ch, gen_if);
1178
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001179 expression = ast_for_expr(c, CHILD(ch, 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001180 if (!expression)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001181 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00001182 asdl_seq_SET(ifs, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183 if (NCH(ch) == 3)
1184 ch = CHILD(ch, 2);
1185 }
1186 /* on exit, must guarantee that ch is a gen_for */
1187 if (TYPE(ch) == gen_iter)
1188 ch = CHILD(ch, 0);
1189 ge->ifs = ifs;
1190 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00001191 asdl_seq_SET(genexps, i, ge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 }
1193
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001194 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195}
1196
1197static expr_ty
1198ast_for_atom(struct compiling *c, const node *n)
1199{
1200 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']'
1201 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1202 */
1203 node *ch = CHILD(n, 0);
1204
1205 switch (TYPE(ch)) {
1206 case NAME:
1207 /* All names start in Load context, but may later be
1208 changed. */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001209 return Name(NEW_IDENTIFIER(ch), Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 case STRING: {
1211 PyObject *str = parsestrplus(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 if (!str)
1213 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001214
1215 PyArena_AddPyObject(c->c_arena, str);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001216 return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 }
1218 case NUMBER: {
1219 PyObject *pynum = parsenumber(STR(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220 if (!pynum)
1221 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001222
1223 PyArena_AddPyObject(c->c_arena, pynum);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001224 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 }
1226 case LPAR: /* some parenthesized expressions */
1227 ch = CHILD(n, 1);
1228
1229 if (TYPE(ch) == RPAR)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001230 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231
1232 if (TYPE(ch) == yield_expr)
1233 return ast_for_expr(c, ch);
1234
1235 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for))
1236 return ast_for_genexp(c, ch);
1237
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001238 return ast_for_testlist_gexp(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239 case LSQB: /* list (or list comprehension) */
1240 ch = CHILD(n, 1);
1241
1242 if (TYPE(ch) == RSQB)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001243 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244
1245 REQ(ch, listmaker);
1246 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1247 asdl_seq *elts = seq_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248 if (!elts)
1249 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001250
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001251 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 }
1253 else
1254 return ast_for_listcomp(c, ch);
1255 case LBRACE: {
1256 /* dictmaker: test ':' test (',' test ':' test)* [','] */
1257 int i, size;
1258 asdl_seq *keys, *values;
1259
1260 ch = CHILD(n, 1);
1261 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001262 keys = asdl_seq_new(size, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263 if (!keys)
1264 return NULL;
1265
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001266 values = asdl_seq_new(size, c->c_arena);
1267 if (!values)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269
1270 for (i = 0; i < NCH(ch); i += 4) {
1271 expr_ty expression;
1272
1273 expression = ast_for_expr(c, CHILD(ch, i));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001274 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001276
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277 asdl_seq_SET(keys, i / 4, expression);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279 expression = ast_for_expr(c, CHILD(ch, i + 2));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001280 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001281 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283 asdl_seq_SET(values, i / 4, expression);
1284 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001285 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286 }
1287 case BACKQUOTE: { /* repr */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001288 expr_ty expression = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 if (!expression)
1290 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001291
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001292 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293 }
1294 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001295 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 return NULL;
1297 }
1298}
1299
1300static slice_ty
1301ast_for_slice(struct compiling *c, const node *n)
1302{
1303 node *ch;
1304 expr_ty lower = NULL, upper = NULL, step = NULL;
1305
1306 REQ(n, subscript);
1307
1308 /*
1309 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1310 sliceop: ':' [test]
1311 */
1312 ch = CHILD(n, 0);
1313 if (TYPE(ch) == DOT)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001314 return Ellipsis(c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315
1316 if (NCH(n) == 1 && TYPE(ch) == test) {
1317 /* 'step' variable hold no significance in terms of being used over
1318 other vars */
1319 step = ast_for_expr(c, ch);
1320 if (!step)
1321 return NULL;
1322
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001323 return Index(step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324 }
1325
1326 if (TYPE(ch) == test) {
1327 lower = ast_for_expr(c, ch);
1328 if (!lower)
1329 return NULL;
1330 }
1331
1332 /* If there's an upper bound it's in the second or third position. */
1333 if (TYPE(ch) == COLON) {
1334 if (NCH(n) > 1) {
1335 node *n2 = CHILD(n, 1);
1336
1337 if (TYPE(n2) == test) {
1338 upper = ast_for_expr(c, n2);
1339 if (!upper)
1340 return NULL;
1341 }
1342 }
1343 } else if (NCH(n) > 2) {
1344 node *n2 = CHILD(n, 2);
1345
1346 if (TYPE(n2) == test) {
1347 upper = ast_for_expr(c, n2);
1348 if (!upper)
1349 return NULL;
1350 }
1351 }
1352
1353 ch = CHILD(n, NCH(n) - 1);
1354 if (TYPE(ch) == sliceop) {
Nick Coghlan77858682006-03-17 17:59:10 +00001355 if (NCH(ch) == 1) {
1356 /* No expression, so step is None */
1357 ch = CHILD(ch, 0);
1358 step = Name(new_identifier("None", c->c_arena), Load,
1359 LINENO(ch), ch->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 if (!step)
1361 return NULL;
Nick Coghlan77858682006-03-17 17:59:10 +00001362 } else {
1363 ch = CHILD(ch, 1);
1364 if (TYPE(ch) == test) {
1365 step = ast_for_expr(c, ch);
1366 if (!step)
1367 return NULL;
1368 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001369 }
1370 }
1371
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001372 return Slice(lower, upper, step, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373}
1374
1375static expr_ty
1376ast_for_binop(struct compiling *c, const node *n)
1377{
1378 /* Must account for a sequence of expressions.
1379 How should A op B op C by represented?
1380 BinOp(BinOp(A, op, B), op, C).
1381 */
1382
1383 int i, nops;
1384 expr_ty expr1, expr2, result;
Anthony Baxtera863d332006-04-11 07:43:46 +00001385 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386
1387 expr1 = ast_for_expr(c, CHILD(n, 0));
1388 if (!expr1)
1389 return NULL;
1390
1391 expr2 = ast_for_expr(c, CHILD(n, 2));
1392 if (!expr2)
1393 return NULL;
1394
Anthony Baxtera863d332006-04-11 07:43:46 +00001395 newoperator = get_operator(CHILD(n, 1));
1396 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 return NULL;
1398
Anthony Baxtera863d332006-04-11 07:43:46 +00001399 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001400 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 if (!result)
1402 return NULL;
1403
1404 nops = (NCH(n) - 1) / 2;
1405 for (i = 1; i < nops; i++) {
1406 expr_ty tmp_result, tmp;
1407 const node* next_oper = CHILD(n, i * 2 + 1);
1408
Anthony Baxtera863d332006-04-11 07:43:46 +00001409 newoperator = get_operator(next_oper);
1410 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411 return NULL;
1412
1413 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1414 if (!tmp)
1415 return NULL;
1416
Anthony Baxtera863d332006-04-11 07:43:46 +00001417 tmp_result = BinOp(result, newoperator, tmp,
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001418 LINENO(next_oper), next_oper->n_col_offset,
1419 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 if (!tmp)
1421 return NULL;
1422 result = tmp_result;
1423 }
1424 return result;
1425}
1426
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001427static expr_ty
1428ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1429{
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001430 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1431 subscriptlist: subscript (',' subscript)* [',']
1432 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1433 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001434 REQ(n, trailer);
1435 if (TYPE(CHILD(n, 0)) == LPAR) {
1436 if (NCH(n) == 2)
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001437 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1438 n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001439 else
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001440 return ast_for_call(c, CHILD(n, 1), left_expr);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001441 }
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001442 else if (TYPE(CHILD(n, 0)) == DOT ) {
1443 return Attribute(left_expr, NEW_IDENTIFIER(CHILD(n, 1)), Load,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001444 LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton9ebfbf02006-02-27 16:50:35 +00001445 }
1446 else {
1447 REQ(CHILD(n, 0), LSQB);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001448 REQ(CHILD(n, 2), RSQB);
1449 n = CHILD(n, 1);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001450 if (NCH(n) == 1) {
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001451 slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1452 if (!slc)
1453 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001454 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1455 c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001456 }
1457 else {
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001458 /* The grammar is ambiguous here. The ambiguity is resolved
1459 by treating the sequence as a tuple literal if there are
1460 no slice features.
1461 */
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001462 int j;
1463 slice_ty slc;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001464 expr_ty e;
Thomas Wouters65b3dab2006-03-01 22:06:23 +00001465 bool simple = true;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001466 asdl_seq *slices, *elts;
1467 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001468 if (!slices)
1469 return NULL;
1470 for (j = 0; j < NCH(n); j += 2) {
1471 slc = ast_for_slice(c, CHILD(n, j));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001472 if (!slc)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001473 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001474 if (slc->kind != Index_kind)
1475 simple = false;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001476 asdl_seq_SET(slices, j / 2, slc);
1477 }
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001478 if (!simple) {
1479 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001480 Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001481 }
1482 /* extract Index values and put them in a Tuple */
1483 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001484 if (!elts)
1485 return NULL;
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001486 for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1487 slc = (slice_ty)asdl_seq_GET(slices, j);
1488 assert(slc->kind == Index_kind && slc->v.Index.value);
1489 asdl_seq_SET(elts, j, slc->v.Index.value);
1490 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001491 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hyltonc7d37262006-02-27 17:29:29 +00001492 if (!e)
1493 return NULL;
1494 return Subscript(left_expr, Index(e, c->c_arena),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001495 Load, LINENO(n), n->n_col_offset, c->c_arena);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001496 }
1497 }
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001498}
1499
1500static expr_ty
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001501ast_for_factor(struct compiling *c, const node *n)
1502{
1503 node *pfactor, *ppower, *patom, *pnum;
1504 expr_ty expression;
1505
1506 /* If the unary - operator is applied to a constant, don't generate
1507 a UNARY_NEGATIVE opcode. Just store the approriate value as a
1508 constant. The peephole optimizer already does something like
1509 this but it doesn't handle the case where the constant is
1510 (sys.maxint - 1). In that case, we want a PyIntObject, not a
1511 PyLongObject.
1512 */
1513 if (TYPE(CHILD(n, 0)) == MINUS
1514 && NCH(n) == 2
1515 && TYPE((pfactor = CHILD(n, 1))) == factor
1516 && NCH(pfactor) == 1
1517 && TYPE((ppower = CHILD(pfactor, 0))) == power
1518 && NCH(ppower) == 1
1519 && TYPE((patom = CHILD(ppower, 0))) == atom
1520 && TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1521 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1522 if (s == NULL)
1523 return NULL;
1524 s[0] = '-';
1525 strcpy(s + 1, STR(pnum));
1526 PyObject_FREE(STR(pnum));
1527 STR(pnum) = s;
1528 return ast_for_atom(c, patom);
1529 }
1530
1531 expression = ast_for_expr(c, CHILD(n, 1));
1532 if (!expression)
1533 return NULL;
1534
1535 switch (TYPE(CHILD(n, 0))) {
1536 case PLUS:
1537 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1538 c->c_arena);
1539 case MINUS:
1540 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1541 c->c_arena);
1542 case TILDE:
1543 return UnaryOp(Invert, expression, LINENO(n),
1544 n->n_col_offset, c->c_arena);
1545 }
1546 PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1547 TYPE(CHILD(n, 0)));
1548 return NULL;
1549}
1550
1551static expr_ty
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001552ast_for_power(struct compiling *c, const node *n)
1553{
1554 /* power: atom trailer* ('**' factor)*
1555 */
1556 int i;
1557 expr_ty e, tmp;
1558 REQ(n, power);
1559 e = ast_for_atom(c, CHILD(n, 0));
1560 if (!e)
1561 return NULL;
1562 if (NCH(n) == 1)
1563 return e;
1564 for (i = 1; i < NCH(n); i++) {
1565 node *ch = CHILD(n, i);
1566 if (TYPE(ch) != trailer)
1567 break;
1568 tmp = ast_for_trailer(c, ch, e);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001569 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001570 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001571 tmp->lineno = e->lineno;
1572 tmp->col_offset = e->col_offset;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001573 e = tmp;
1574 }
1575 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1576 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001577 if (!f)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001578 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001579 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001580 if (!tmp)
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001581 return NULL;
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001582 e = tmp;
1583 }
1584 return e;
1585}
1586
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587/* Do not name a variable 'expr'! Will cause a compile error.
1588*/
1589
1590static expr_ty
1591ast_for_expr(struct compiling *c, const node *n)
1592{
1593 /* handle the full range of simple expressions
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001594 test: or_test ['if' or_test 'else' test] | lambdef
1595 or_test: and_test ('or' and_test)*
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001596 and_test: not_test ('and' not_test)*
1597 not_test: 'not' not_test | comparison
1598 comparison: expr (comp_op expr)*
1599 expr: xor_expr ('|' xor_expr)*
1600 xor_expr: and_expr ('^' and_expr)*
1601 and_expr: shift_expr ('&' shift_expr)*
1602 shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1603 arith_expr: term (('+'|'-') term)*
1604 term: factor (('*'|'/'|'%'|'//') factor)*
1605 factor: ('+'|'-'|'~') factor | power
1606 power: atom trailer* ('**' factor)*
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001607
1608 As well as modified versions that exist for backward compatibility,
1609 to explicitly allow:
1610 [ x for x in lambda: 0, lambda: 1 ]
1611 (which would be ambiguous without these extra rules)
1612
1613 old_test: or_test | old_lambdef
1614 old_lambdef: 'lambda' [vararglist] ':' old_test
1615
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001616 */
1617
1618 asdl_seq *seq;
1619 int i;
1620
1621 loop:
1622 switch (TYPE(n)) {
1623 case test:
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001624 case old_test:
1625 if (TYPE(CHILD(n, 0)) == lambdef ||
1626 TYPE(CHILD(n, 0)) == old_lambdef)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001627 return ast_for_lambdef(c, CHILD(n, 0));
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001628 else if (NCH(n) > 1)
1629 return ast_for_ifexpr(c, n);
1630 /* Fallthrough */
1631 case or_test:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001632 case and_test:
1633 if (NCH(n) == 1) {
1634 n = CHILD(n, 0);
1635 goto loop;
1636 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001637 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638 if (!seq)
1639 return NULL;
1640 for (i = 0; i < NCH(n); i += 2) {
1641 expr_ty e = ast_for_expr(c, CHILD(n, i));
1642 if (!e)
1643 return NULL;
1644 asdl_seq_SET(seq, i / 2, e);
1645 }
1646 if (!strcmp(STR(CHILD(n, 1)), "and"))
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001647 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1648 c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001649 assert(!strcmp(STR(CHILD(n, 1)), "or"));
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001650 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651 case not_test:
1652 if (NCH(n) == 1) {
1653 n = CHILD(n, 0);
1654 goto loop;
1655 }
1656 else {
1657 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1658 if (!expression)
1659 return NULL;
1660
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001661 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1662 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001663 }
1664 case comparison:
1665 if (NCH(n) == 1) {
1666 n = CHILD(n, 0);
1667 goto loop;
1668 }
1669 else {
1670 expr_ty expression;
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001671 asdl_int_seq *ops;
1672 asdl_seq *cmps;
1673 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 if (!ops)
1675 return NULL;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001676 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001677 if (!cmps) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678 return NULL;
1679 }
1680 for (i = 1; i < NCH(n); i += 2) {
Anthony Baxtera863d332006-04-11 07:43:46 +00001681 cmpop_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001682
Anthony Baxtera863d332006-04-11 07:43:46 +00001683 newoperator = ast_for_comp_op(CHILD(n, i));
1684 if (!newoperator) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001685 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001686 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001687
1688 expression = ast_for_expr(c, CHILD(n, i + 1));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001689 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001690 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00001693 asdl_seq_SET(ops, i / 2, newoperator);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694 asdl_seq_SET(cmps, i / 2, expression);
1695 }
1696 expression = ast_for_expr(c, CHILD(n, 0));
Neal Norwitze76adcd2005-11-15 05:04:31 +00001697 if (!expression) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00001699 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700
Jeremy Hylton2f327c12006-04-04 04:00:23 +00001701 return Compare(expression, ops, cmps, LINENO(n),
1702 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703 }
1704 break;
1705
1706 /* The next five cases all handle BinOps. The main body of code
1707 is the same in each case, but the switch turned inside out to
1708 reuse the code for each type of operator.
1709 */
1710 case expr:
1711 case xor_expr:
1712 case and_expr:
1713 case shift_expr:
1714 case arith_expr:
1715 case term:
1716 if (NCH(n) == 1) {
1717 n = CHILD(n, 0);
1718 goto loop;
1719 }
1720 return ast_for_binop(c, n);
1721 case yield_expr: {
1722 expr_ty exp = NULL;
1723 if (NCH(n) == 2) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001724 exp = ast_for_testlist(c, CHILD(n, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001725 if (!exp)
1726 return NULL;
1727 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001728 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001730 case factor:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001731 if (NCH(n) == 1) {
1732 n = CHILD(n, 0);
1733 goto loop;
1734 }
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +00001735 return ast_for_factor(c, n);
Neil Schemenauer982e8d62005-10-25 09:16:05 +00001736 case power:
1737 return ast_for_power(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738 default:
Neal Norwitz79792652005-11-14 04:25:03 +00001739 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001740 return NULL;
1741 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001742 /* should never get here unless if error is set */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001743 return NULL;
1744}
1745
1746static expr_ty
1747ast_for_call(struct compiling *c, const node *n, expr_ty func)
1748{
1749 /*
1750 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1751 | '**' test)
1752 argument: [test '='] test [gen_for] # Really [keyword '='] test
1753 */
1754
1755 int i, nargs, nkeywords, ngens;
Neal Norwitz84456bd2005-12-18 03:16:20 +00001756 asdl_seq *args;
1757 asdl_seq *keywords;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001758 expr_ty vararg = NULL, kwarg = NULL;
1759
1760 REQ(n, arglist);
1761
1762 nargs = 0;
1763 nkeywords = 0;
1764 ngens = 0;
1765 for (i = 0; i < NCH(n); i++) {
1766 node *ch = CHILD(n, i);
1767 if (TYPE(ch) == argument) {
1768 if (NCH(ch) == 1)
1769 nargs++;
1770 else if (TYPE(CHILD(ch, 1)) == gen_for)
1771 ngens++;
1772 else
1773 nkeywords++;
1774 }
1775 }
1776 if (ngens > 1 || (ngens && (nargs || nkeywords))) {
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001777 ast_error(n, "Generator expression must be parenthesized "
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 "if not sole argument");
1779 return NULL;
1780 }
1781
1782 if (nargs + nkeywords + ngens > 255) {
1783 ast_error(n, "more than 255 arguments");
1784 return NULL;
1785 }
1786
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001787 args = asdl_seq_new(nargs + ngens, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001788 if (!args)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001789 return NULL;
1790 keywords = asdl_seq_new(nkeywords, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001791 if (!keywords)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001792 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 nargs = 0;
1794 nkeywords = 0;
1795 for (i = 0; i < NCH(n); i++) {
1796 node *ch = CHILD(n, i);
1797 if (TYPE(ch) == argument) {
1798 expr_ty e;
1799 if (NCH(ch) == 1) {
Neal Norwitz5ef92242006-05-19 06:43:50 +00001800 if (nkeywords) {
1801 ast_error(CHILD(ch, 0),
1802 "non-keyword arg after keyword arg");
1803 return NULL;
1804 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 e = ast_for_expr(c, CHILD(ch, 0));
1806 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001807 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808 asdl_seq_SET(args, nargs++, e);
1809 }
1810 else if (TYPE(CHILD(ch, 1)) == gen_for) {
1811 e = ast_for_genexp(c, ch);
1812 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001813 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001814 asdl_seq_SET(args, nargs++, e);
1815 }
1816 else {
1817 keyword_ty kw;
1818 identifier key;
1819
1820 /* CHILD(ch, 0) is test, but must be an identifier? */
1821 e = ast_for_expr(c, CHILD(ch, 0));
1822 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001823 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 /* f(lambda x: x[0] = 3) ends up getting parsed with
1825 * LHS test = lambda x: x[0], and RHS test = 3.
1826 * SF bug 132313 points out that complaining about a keyword
1827 * then is very confusing.
1828 */
1829 if (e->kind == Lambda_kind) {
1830 ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001831 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 } else if (e->kind != Name_kind) {
1833 ast_error(CHILD(ch, 0), "keyword can't be an expression");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001834 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001835 }
1836 key = e->v.Name.id;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 e = ast_for_expr(c, CHILD(ch, 2));
1838 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001839 return NULL;
1840 kw = keyword(key, e, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001841 if (!kw)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001842 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843 asdl_seq_SET(keywords, nkeywords++, kw);
1844 }
1845 }
1846 else if (TYPE(ch) == STAR) {
1847 vararg = ast_for_expr(c, CHILD(n, i+1));
1848 i++;
1849 }
1850 else if (TYPE(ch) == DOUBLESTAR) {
1851 kwarg = ast_for_expr(c, CHILD(n, i+1));
1852 i++;
1853 }
1854 }
1855
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001856 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857}
1858
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001859static expr_ty
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001860ast_for_testlist(struct compiling *c, const node* n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861{
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001862 /* testlist_gexp: test (',' test)* [','] */
1863 /* testlist: test (',' test)* [','] */
1864 /* testlist_safe: test (',' test)+ [','] */
1865 /* testlist1: test (',' test)* */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001866 assert(NCH(n) > 0);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001867 if (TYPE(n) == testlist_gexp) {
1868 if (NCH(n) > 1)
1869 assert(TYPE(CHILD(n, 1)) != gen_for);
1870 }
1871 else {
1872 assert(TYPE(n) == testlist ||
1873 TYPE(n) == testlist_safe ||
1874 TYPE(n) == testlist1);
1875 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876 if (NCH(n) == 1)
1877 return ast_for_expr(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 else {
1879 asdl_seq *tmp = seq_for_testlist(c, n);
1880 if (!tmp)
1881 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001882 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001884}
1885
1886static expr_ty
1887ast_for_testlist_gexp(struct compiling *c, const node* n)
1888{
1889 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1890 /* argument: test [ gen_for ] */
1891 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001892 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001893 return ast_for_genexp(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001894 return ast_for_testlist(c, n);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001895}
1896
1897/* like ast_for_testlist() but returns a sequence */
1898static asdl_seq*
1899ast_for_class_bases(struct compiling *c, const node* n)
1900{
1901 /* testlist: test (',' test)* [','] */
1902 assert(NCH(n) > 0);
1903 REQ(n, testlist);
1904 if (NCH(n) == 1) {
1905 expr_ty base;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001906 asdl_seq *bases = asdl_seq_new(1, c->c_arena);
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001907 if (!bases)
1908 return NULL;
1909 base = ast_for_expr(c, CHILD(n, 0));
Neal Norwitz84456bd2005-12-18 03:16:20 +00001910 if (!base)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001911 return NULL;
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001912 asdl_seq_SET(bases, 0, base);
1913 return bases;
1914 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00001915
1916 return seq_for_testlist(c, n);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917}
1918
1919static stmt_ty
1920ast_for_expr_stmt(struct compiling *c, const node *n)
1921{
1922 REQ(n, expr_stmt);
1923 /* expr_stmt: testlist (augassign (yield_expr|testlist)
1924 | ('=' (yield_expr|testlist))*)
1925 testlist: test (',' test)* [',']
1926 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
1927 | '<<=' | '>>=' | '**=' | '//='
1928 test: ... here starts the operator precendence dance
1929 */
1930
1931 if (NCH(n) == 1) {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001932 expr_ty e = ast_for_testlist(c, CHILD(n, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 if (!e)
1934 return NULL;
1935
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001936 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937 }
1938 else if (TYPE(CHILD(n, 1)) == augassign) {
1939 expr_ty expr1, expr2;
Anthony Baxtera863d332006-04-11 07:43:46 +00001940 operator_ty newoperator;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 node *ch = CHILD(n, 0);
1942
Neal Norwitz0d62a062006-07-30 06:53:31 +00001943 expr1 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 if (!expr1)
1945 return NULL;
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001946 /* TODO(nas): Remove duplicated error checks (set_context does it) */
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001947 switch (expr1->kind) {
1948 case GeneratorExp_kind:
1949 ast_error(ch, "augmented assignment to generator "
1950 "expression not possible");
1951 return NULL;
Neal Norwitz0d62a062006-07-30 06:53:31 +00001952 case Yield_kind:
1953 ast_error(ch, "augmented assignment to yield "
1954 "expression not possible");
1955 return NULL;
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001956 case Name_kind: {
1957 const char *var_name = PyString_AS_STRING(expr1->v.Name.id);
1958 if (var_name[0] == 'N' && !strcmp(var_name, "None")) {
1959 ast_error(ch, "assignment to None");
1960 return NULL;
1961 }
1962 break;
1963 }
1964 case Attribute_kind:
1965 case Subscript_kind:
1966 break;
1967 default:
1968 ast_error(ch, "illegal expression for augmented "
1969 "assignment");
1970 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971 }
Neil Schemenauer0e07b602006-07-09 16:16:34 +00001972 set_context(expr1, Store, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973
1974 ch = CHILD(n, 2);
1975 if (TYPE(ch) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00001976 expr2 = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977 else
Neal Norwitz0d62a062006-07-30 06:53:31 +00001978 expr2 = ast_for_expr(c, ch);
Neal Norwitz84456bd2005-12-18 03:16:20 +00001979 if (!expr2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980 return NULL;
1981
Anthony Baxtera863d332006-04-11 07:43:46 +00001982 newoperator = ast_for_augassign(CHILD(n, 1));
1983 if (!newoperator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984 return NULL;
1985
Anthony Baxtera863d332006-04-11 07:43:46 +00001986 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 }
1988 else {
1989 int i;
1990 asdl_seq *targets;
1991 node *value;
1992 expr_ty expression;
1993
1994 /* a normal assignment */
1995 REQ(CHILD(n, 1), EQUAL);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001996 targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997 if (!targets)
1998 return NULL;
1999 for (i = 0; i < NCH(n) - 2; i += 2) {
Armin Rigo31441302005-10-21 12:57:31 +00002000 expr_ty e;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 node *ch = CHILD(n, i);
2002 if (TYPE(ch) == yield_expr) {
2003 ast_error(ch, "assignment to yield expression not possible");
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002004 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002005 }
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002006 e = ast_for_testlist(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002007
2008 /* set context to assign */
2009 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002010 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Neal Norwitz84456bd2005-12-18 03:16:20 +00002012 if (!set_context(e, Store, CHILD(n, i)))
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002013 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014
2015 asdl_seq_SET(targets, i / 2, e);
2016 }
2017 value = CHILD(n, NCH(n) - 1);
2018 if (TYPE(value) == testlist)
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002019 expression = ast_for_testlist(c, value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 else
2021 expression = ast_for_expr(c, value);
2022 if (!expression)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002023 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002024 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
2028static stmt_ty
2029ast_for_print_stmt(struct compiling *c, const node *n)
2030{
2031 /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2032 | '>>' test [ (',' test)+ [','] ] )
2033 */
2034 expr_ty dest = NULL, expression;
2035 asdl_seq *seq;
2036 bool nl;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002037 int i, j, start = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038
2039 REQ(n, print_stmt);
2040 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2041 dest = ast_for_expr(c, CHILD(n, 2));
2042 if (!dest)
2043 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002044 start = 4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002046 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (!seq)
Jeremy Hyltona8293132006-02-28 17:58:27 +00002048 return NULL;
2049 for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 expression = ast_for_expr(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002051 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002053 asdl_seq_SET(seq, j, expression);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054 }
2055 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002056 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002057}
2058
2059static asdl_seq *
Martin v. Löwis28457502006-04-11 09:17:27 +00002060ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061{
2062 asdl_seq *seq;
2063 int i;
2064 expr_ty e;
2065
2066 REQ(n, exprlist);
2067
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002068 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 if (!seq)
2070 return NULL;
2071 for (i = 0; i < NCH(n); i += 2) {
2072 e = ast_for_expr(c, CHILD(n, i));
Neal Norwitze76adcd2005-11-15 05:04:31 +00002073 if (!e)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002074 return NULL;
Neal Norwitz6b347892005-11-15 07:17:53 +00002075 asdl_seq_SET(seq, i / 2, e);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002076 if (context && !set_context(e, context, CHILD(n, i)))
2077 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 }
2079 return seq;
2080}
2081
2082static stmt_ty
2083ast_for_del_stmt(struct compiling *c, const node *n)
2084{
2085 asdl_seq *expr_list;
2086
2087 /* del_stmt: 'del' exprlist */
2088 REQ(n, del_stmt);
2089
2090 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2091 if (!expr_list)
2092 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002093 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094}
2095
2096static stmt_ty
2097ast_for_flow_stmt(struct compiling *c, const node *n)
2098{
2099 /*
2100 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2101 | yield_stmt
2102 break_stmt: 'break'
2103 continue_stmt: 'continue'
2104 return_stmt: 'return' [testlist]
2105 yield_stmt: yield_expr
2106 yield_expr: 'yield' testlist
2107 raise_stmt: 'raise' [test [',' test [',' test]]]
2108 */
2109 node *ch;
2110
2111 REQ(n, flow_stmt);
2112 ch = CHILD(n, 0);
2113 switch (TYPE(ch)) {
2114 case break_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002115 return Break(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 case continue_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002117 return Continue(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 case yield_stmt: { /* will reduce to yield_expr */
2119 expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2120 if (!exp)
2121 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002122 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123 }
2124 case return_stmt:
2125 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002126 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 else {
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002128 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 if (!expression)
2130 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002131 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 }
2133 case raise_stmt:
2134 if (NCH(ch) == 1)
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002135 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 else if (NCH(ch) == 2) {
2137 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2138 if (!expression)
2139 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002140 return Raise(expression, NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141 }
2142 else if (NCH(ch) == 4) {
2143 expr_ty expr1, expr2;
2144
2145 expr1 = ast_for_expr(c, CHILD(ch, 1));
2146 if (!expr1)
2147 return NULL;
2148 expr2 = ast_for_expr(c, CHILD(ch, 3));
2149 if (!expr2)
2150 return NULL;
2151
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002152 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 }
2154 else if (NCH(ch) == 6) {
2155 expr_ty expr1, expr2, expr3;
2156
2157 expr1 = ast_for_expr(c, CHILD(ch, 1));
2158 if (!expr1)
2159 return NULL;
2160 expr2 = ast_for_expr(c, CHILD(ch, 3));
2161 if (!expr2)
2162 return NULL;
2163 expr3 = ast_for_expr(c, CHILD(ch, 5));
2164 if (!expr3)
2165 return NULL;
2166
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002167 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002168 }
2169 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002170 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 "unexpected flow_stmt: %d", TYPE(ch));
2172 return NULL;
2173 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002174
2175 PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2176 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177}
2178
2179static alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002180alias_for_import_name(struct compiling *c, const node *n)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181{
2182 /*
Thomas Wouters8ae12952006-02-28 22:42:15 +00002183 import_as_name: NAME ['as' NAME]
2184 dotted_as_name: dotted_name ['as' NAME]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185 dotted_name: NAME ('.' NAME)*
2186 */
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002187 PyObject *str;
2188
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189 loop:
2190 switch (TYPE(n)) {
2191 case import_as_name:
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002192 str = NULL;
2193 if (NCH(n) == 3) {
2194 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2195 ast_error(n, "must use 'as' in import");
2196 return NULL;
2197 }
2198 str = NEW_IDENTIFIER(CHILD(n, 2));
2199 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002200 return alias(NEW_IDENTIFIER(CHILD(n, 0)), str, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 case dotted_as_name:
2202 if (NCH(n) == 1) {
2203 n = CHILD(n, 0);
2204 goto loop;
2205 }
2206 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002207 alias_ty a = alias_for_import_name(c, CHILD(n, 0));
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00002208 if (!a)
2209 return NULL;
Neal Norwitzfb48afa2006-07-08 05:31:37 +00002210 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2211 ast_error(n, "must use 'as' in import");
2212 return NULL;
2213 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214 assert(!a->asname);
2215 a->asname = NEW_IDENTIFIER(CHILD(n, 2));
2216 return a;
2217 }
2218 break;
2219 case dotted_name:
2220 if (NCH(n) == 1)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002221 return alias(NEW_IDENTIFIER(CHILD(n, 0)), NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222 else {
2223 /* Create a string of the form "a.b.c" */
Tim Peterse93e64f2006-01-08 02:28:41 +00002224 int i;
Tim Peters5db42c42006-01-08 02:25:34 +00002225 size_t len;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002226 char *s;
2227
2228 len = 0;
2229 for (i = 0; i < NCH(n); i += 2)
2230 /* length of string plus one for the dot */
2231 len += strlen(STR(CHILD(n, i))) + 1;
2232 len--; /* the last name doesn't have a dot */
2233 str = PyString_FromStringAndSize(NULL, len);
2234 if (!str)
2235 return NULL;
2236 s = PyString_AS_STRING(str);
2237 if (!s)
2238 return NULL;
2239 for (i = 0; i < NCH(n); i += 2) {
2240 char *sch = STR(CHILD(n, i));
2241 strcpy(s, STR(CHILD(n, i)));
2242 s += strlen(sch);
2243 *s++ = '.';
2244 }
2245 --s;
2246 *s = '\0';
2247 PyString_InternInPlace(&str);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002248 PyArena_AddPyObject(c->c_arena, str);
2249 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250 }
2251 break;
2252 case STAR:
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002253 str = PyString_InternFromString("*");
2254 PyArena_AddPyObject(c->c_arena, str);
2255 return alias(str, NULL, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002257 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 "unexpected import name: %d", TYPE(n));
2259 return NULL;
2260 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002261
2262 PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 return NULL;
2264}
2265
2266static stmt_ty
2267ast_for_import_stmt(struct compiling *c, const node *n)
2268{
2269 /*
2270 import_stmt: import_name | import_from
2271 import_name: 'import' dotted_as_names
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002272 import_from: 'from' ('.'* dotted_name | '.') 'import'
2273 ('*' | '(' import_as_names ')' | import_as_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 */
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002275 int lineno;
2276 int col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 int i;
2278 asdl_seq *aliases;
2279
2280 REQ(n, import_stmt);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002281 lineno = LINENO(n);
2282 col_offset = n->n_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283 n = CHILD(n, 0);
Thomas Wouters8622e932006-02-27 17:14:45 +00002284 if (TYPE(n) == import_name) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 n = CHILD(n, 1);
Neil Schemenauer147b7592005-10-23 03:38:19 +00002286 REQ(n, dotted_as_names);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002287 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 if (!aliases)
2289 return NULL;
2290 for (i = 0; i < NCH(n); i += 2) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002291 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002292 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294 asdl_seq_SET(aliases, i / 2, import_alias);
2295 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002296 return Import(aliases, lineno, col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297 }
Thomas Wouters8622e932006-02-27 17:14:45 +00002298 else if (TYPE(n) == import_from) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299 int n_children;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002300 int idx, ndots = 0;
2301 alias_ty mod = NULL;
2302 identifier modname;
2303
2304 /* Count the number of dots (for relative imports) and check for the
2305 optional module name */
2306 for (idx = 1; idx < NCH(n); idx++) {
2307 if (TYPE(CHILD(n, idx)) == dotted_name) {
2308 mod = alias_for_import_name(c, CHILD(n, idx));
2309 idx++;
2310 break;
2311 } else if (TYPE(CHILD(n, idx)) != DOT) {
2312 break;
2313 }
2314 ndots++;
2315 }
2316 idx++; /* skip over the 'import' keyword */
2317 switch (TYPE(CHILD(n, idx))) {
Thomas Wouters106203c2006-02-27 17:05:19 +00002318 case STAR:
2319 /* from ... import * */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002320 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002321 n_children = 1;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002322 if (ndots) {
2323 ast_error(n, "'import *' not allowed with 'from .'");
2324 return NULL;
2325 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002326 break;
2327 case LPAR:
2328 /* from ... import (x, y, z) */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002329 n = CHILD(n, idx + 1);
Thomas Wouters106203c2006-02-27 17:05:19 +00002330 n_children = NCH(n);
2331 break;
2332 case import_as_names:
2333 /* from ... import x, y, z */
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002334 n = CHILD(n, idx);
Thomas Wouters106203c2006-02-27 17:05:19 +00002335 n_children = NCH(n);
2336 if (n_children % 2 == 0) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 ast_error(n, "trailing comma not allowed without"
2338 " surrounding parentheses");
2339 return NULL;
2340 }
Thomas Wouters106203c2006-02-27 17:05:19 +00002341 break;
2342 default:
2343 ast_error(n, "Unexpected node-type in from-import");
2344 return NULL;
Neal Norwitze76adcd2005-11-15 05:04:31 +00002345 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002347 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002348 if (!aliases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350
2351 /* handle "from ... import *" special b/c there's no children */
Thomas Wouters106203c2006-02-27 17:05:19 +00002352 if (TYPE(n) == STAR) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002353 alias_ty import_alias = alias_for_import_name(c, n);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002354 if (!import_alias)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002355 return NULL;
Jeremy Hyltona8293132006-02-28 17:58:27 +00002356 asdl_seq_SET(aliases, 0, import_alias);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002357 }
Jeremy Hyltona8293132006-02-28 17:58:27 +00002358 else {
2359 for (i = 0; i < NCH(n); i += 2) {
2360 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i));
2361 if (!import_alias)
2362 return NULL;
2363 asdl_seq_SET(aliases, i / 2, import_alias);
2364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002365 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002366 if (mod != NULL)
2367 modname = mod->name;
2368 else
2369 modname = new_identifier("", c->c_arena);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002370 return ImportFrom(modname, aliases, ndots, lineno, col_offset,
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002371 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372 }
Neal Norwitz79792652005-11-14 04:25:03 +00002373 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374 "unknown import statement: starts with command '%s'",
2375 STR(CHILD(n, 0)));
2376 return NULL;
2377}
2378
2379static stmt_ty
2380ast_for_global_stmt(struct compiling *c, const node *n)
2381{
2382 /* global_stmt: 'global' NAME (',' NAME)* */
2383 identifier name;
2384 asdl_seq *s;
2385 int i;
2386
2387 REQ(n, global_stmt);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002388 s = asdl_seq_new(NCH(n) / 2, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 if (!s)
2390 return NULL;
2391 for (i = 1; i < NCH(n); i += 2) {
2392 name = NEW_IDENTIFIER(CHILD(n, i));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002393 if (!name)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 asdl_seq_SET(s, i / 2, name);
2396 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002397 return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002398}
2399
2400static stmt_ty
2401ast_for_exec_stmt(struct compiling *c, const node *n)
2402{
2403 expr_ty expr1, globals = NULL, locals = NULL;
2404 int n_children = NCH(n);
2405 if (n_children != 2 && n_children != 4 && n_children != 6) {
Neal Norwitz79792652005-11-14 04:25:03 +00002406 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407 "poorly formed 'exec' statement: %d parts to statement",
2408 n_children);
2409 return NULL;
2410 }
2411
2412 /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2413 REQ(n, exec_stmt);
2414 expr1 = ast_for_expr(c, CHILD(n, 1));
2415 if (!expr1)
2416 return NULL;
2417 if (n_children >= 4) {
2418 globals = ast_for_expr(c, CHILD(n, 3));
2419 if (!globals)
2420 return NULL;
2421 }
2422 if (n_children == 6) {
2423 locals = ast_for_expr(c, CHILD(n, 5));
2424 if (!locals)
2425 return NULL;
2426 }
2427
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002428 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002429}
2430
2431static stmt_ty
2432ast_for_assert_stmt(struct compiling *c, const node *n)
2433{
2434 /* assert_stmt: 'assert' test [',' test] */
2435 REQ(n, assert_stmt);
2436 if (NCH(n) == 2) {
2437 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2438 if (!expression)
2439 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002440 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 }
2442 else if (NCH(n) == 4) {
2443 expr_ty expr1, expr2;
2444
2445 expr1 = ast_for_expr(c, CHILD(n, 1));
2446 if (!expr1)
2447 return NULL;
2448 expr2 = ast_for_expr(c, CHILD(n, 3));
2449 if (!expr2)
2450 return NULL;
2451
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002452 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453 }
Neal Norwitz79792652005-11-14 04:25:03 +00002454 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455 "improper number of parts to 'assert' statement: %d",
2456 NCH(n));
2457 return NULL;
2458}
2459
2460static asdl_seq *
2461ast_for_suite(struct compiling *c, const node *n)
2462{
2463 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
Neal Norwitz84456bd2005-12-18 03:16:20 +00002464 asdl_seq *seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002465 stmt_ty s;
2466 int i, total, num, end, pos = 0;
2467 node *ch;
2468
2469 REQ(n, suite);
2470
2471 total = num_stmts(n);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002472 seq = asdl_seq_new(total, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473 if (!seq)
2474 return NULL;
2475 if (TYPE(CHILD(n, 0)) == simple_stmt) {
2476 n = CHILD(n, 0);
2477 /* simple_stmt always ends with a NEWLINE,
2478 and may have a trailing SEMI
2479 */
2480 end = NCH(n) - 1;
2481 if (TYPE(CHILD(n, end - 1)) == SEMI)
2482 end--;
2483 /* loop by 2 to skip semi-colons */
2484 for (i = 0; i < end; i += 2) {
2485 ch = CHILD(n, i);
2486 s = ast_for_stmt(c, ch);
2487 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 asdl_seq_SET(seq, pos++, s);
2490 }
2491 }
2492 else {
2493 for (i = 2; i < (NCH(n) - 1); i++) {
2494 ch = CHILD(n, i);
2495 REQ(ch, stmt);
2496 num = num_stmts(ch);
2497 if (num == 1) {
2498 /* small_stmt or compound_stmt with only one child */
2499 s = ast_for_stmt(c, ch);
2500 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002501 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 asdl_seq_SET(seq, pos++, s);
2503 }
2504 else {
2505 int j;
2506 ch = CHILD(ch, 0);
2507 REQ(ch, simple_stmt);
2508 for (j = 0; j < NCH(ch); j += 2) {
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002509 /* statement terminates with a semi-colon ';' */
2510 if (NCH(CHILD(ch, j)) == 0) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002511 assert((j + 1) == NCH(ch));
2512 break;
Neal Norwitzf8d403d2005-12-11 20:12:40 +00002513 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514 s = ast_for_stmt(c, CHILD(ch, j));
2515 if (!s)
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002516 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 asdl_seq_SET(seq, pos++, s);
2518 }
2519 }
2520 }
2521 }
2522 assert(pos == seq->size);
2523 return seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002524}
2525
2526static stmt_ty
2527ast_for_if_stmt(struct compiling *c, const node *n)
2528{
2529 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2530 ['else' ':' suite]
2531 */
2532 char *s;
2533
2534 REQ(n, if_stmt);
2535
2536 if (NCH(n) == 4) {
2537 expr_ty expression;
2538 asdl_seq *suite_seq;
2539
2540 expression = ast_for_expr(c, CHILD(n, 1));
2541 if (!expression)
2542 return NULL;
2543 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002544 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 return NULL;
2546
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002547 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002550 s = STR(CHILD(n, 4));
2551 /* s[2], the third character in the string, will be
2552 's' for el_s_e, or
2553 'i' for el_i_f
2554 */
2555 if (s[2] == 's') {
2556 expr_ty expression;
2557 asdl_seq *seq1, *seq2;
2558
2559 expression = ast_for_expr(c, CHILD(n, 1));
2560 if (!expression)
2561 return NULL;
2562 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002563 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 return NULL;
2565 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002566 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567 return NULL;
2568
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002569 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002570 }
2571 else if (s[2] == 'i') {
2572 int i, n_elif, has_else = 0;
2573 asdl_seq *orelse = NULL;
2574 n_elif = NCH(n) - 4;
2575 /* must reference the child n_elif+1 since 'else' token is third,
2576 not fourth, child from the end. */
2577 if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2578 && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2579 has_else = 1;
2580 n_elif -= 3;
2581 }
2582 n_elif /= 4;
2583
2584 if (has_else) {
2585 expr_ty expression;
2586 asdl_seq *seq1, *seq2;
2587
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002588 orelse = asdl_seq_new(1, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002589 if (!orelse)
2590 return NULL;
2591 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002592 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594 seq1 = ast_for_suite(c, CHILD(n, NCH(n) - 4));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002595 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597 seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002598 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002599 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600
2601 asdl_seq_SET(orelse, 0, If(expression, seq1, seq2,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002602 LINENO(CHILD(n, NCH(n) - 6)), CHILD(n, NCH(n) - 6)->n_col_offset,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00002603 c->c_arena));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 /* the just-created orelse handled the last elif */
2605 n_elif--;
2606 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607
2608 for (i = 0; i < n_elif; i++) {
2609 int off = 5 + (n_elif - i - 1) * 4;
2610 expr_ty expression;
2611 asdl_seq *suite_seq;
Anthony Baxtera863d332006-04-11 07:43:46 +00002612 asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2613 if (!newobj)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614 return NULL;
2615 expression = ast_for_expr(c, CHILD(n, off));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002616 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002618 suite_seq = ast_for_suite(c, CHILD(n, off + 2));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002619 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002621
Anthony Baxtera863d332006-04-11 07:43:46 +00002622 asdl_seq_SET(newobj, 0,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 If(expression, suite_seq, orelse,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002624 LINENO(CHILD(n, off)), CHILD(n, off)->n_col_offset, c->c_arena));
Anthony Baxtera863d332006-04-11 07:43:46 +00002625 orelse = newobj;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627 return If(ast_for_expr(c, CHILD(n, 1)),
2628 ast_for_suite(c, CHILD(n, 3)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002629 orelse, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002631
2632 PyErr_Format(PyExc_SystemError,
2633 "unexpected token in 'if' statement: %s", s);
2634 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635}
2636
2637static stmt_ty
2638ast_for_while_stmt(struct compiling *c, const node *n)
2639{
2640 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2641 REQ(n, while_stmt);
2642
2643 if (NCH(n) == 4) {
2644 expr_ty expression;
2645 asdl_seq *suite_seq;
2646
2647 expression = ast_for_expr(c, CHILD(n, 1));
2648 if (!expression)
2649 return NULL;
2650 suite_seq = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002651 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652 return NULL;
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002653 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002654 }
2655 else if (NCH(n) == 7) {
2656 expr_ty expression;
2657 asdl_seq *seq1, *seq2;
2658
2659 expression = ast_for_expr(c, CHILD(n, 1));
2660 if (!expression)
2661 return NULL;
2662 seq1 = ast_for_suite(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002663 if (!seq1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 return NULL;
2665 seq2 = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002666 if (!seq2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667 return NULL;
2668
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002669 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002671
2672 PyErr_Format(PyExc_SystemError,
2673 "wrong number of tokens for 'while' statement: %d",
2674 NCH(n));
2675 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676}
2677
2678static stmt_ty
2679ast_for_for_stmt(struct compiling *c, const node *n)
2680{
Neal Norwitz84456bd2005-12-18 03:16:20 +00002681 asdl_seq *_target, *seq = NULL, *suite_seq;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 expr_ty expression;
2683 expr_ty target;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002684 const node *node_target;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2686 REQ(n, for_stmt);
2687
2688 if (NCH(n) == 9) {
2689 seq = ast_for_suite(c, CHILD(n, 8));
2690 if (!seq)
2691 return NULL;
2692 }
2693
Neal Norwitzedef2be2006-07-12 05:26:17 +00002694 node_target = CHILD(n, 1);
2695 _target = ast_for_exprlist(c, node_target, Store);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002696 if (!_target)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 return NULL;
Neal Norwitzedef2be2006-07-12 05:26:17 +00002698 /* Check the # of children rather than the length of _target, since
2699 for x, in ... has 1 element in _target, but still requires a Tuple. */
2700 if (NCH(node_target) == 1)
Martin v. Löwis28457502006-04-11 09:17:27 +00002701 target = (expr_ty)asdl_seq_GET(_target, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 else
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002703 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002705 expression = ast_for_testlist(c, CHILD(n, 3));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002706 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707 return NULL;
2708 suite_seq = ast_for_suite(c, CHILD(n, 5));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002709 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 return NULL;
2711
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002712 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
2713 c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714}
2715
2716static excepthandler_ty
2717ast_for_except_clause(struct compiling *c, const node *exc, node *body)
2718{
2719 /* except_clause: 'except' [test [',' test]] */
2720 REQ(exc, except_clause);
2721 REQ(body, suite);
2722
2723 if (NCH(exc) == 1) {
2724 asdl_seq *suite_seq = ast_for_suite(c, body);
2725 if (!suite_seq)
2726 return NULL;
2727
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002728 return excepthandler(NULL, NULL, suite_seq, LINENO(exc),
2729 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002730 }
2731 else if (NCH(exc) == 2) {
2732 expr_ty expression;
2733 asdl_seq *suite_seq;
2734
2735 expression = ast_for_expr(c, CHILD(exc, 1));
2736 if (!expression)
2737 return NULL;
2738 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002739 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740 return NULL;
2741
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002742 return excepthandler(expression, NULL, suite_seq, LINENO(exc),
2743 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 }
2745 else if (NCH(exc) == 4) {
2746 asdl_seq *suite_seq;
2747 expr_ty expression;
2748 expr_ty e = ast_for_expr(c, CHILD(exc, 3));
2749 if (!e)
2750 return NULL;
Neal Norwitz84456bd2005-12-18 03:16:20 +00002751 if (!set_context(e, Store, CHILD(exc, 3)))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752 return NULL;
2753 expression = ast_for_expr(c, CHILD(exc, 1));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002754 if (!expression)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755 return NULL;
2756 suite_seq = ast_for_suite(c, body);
Neal Norwitz84456bd2005-12-18 03:16:20 +00002757 if (!suite_seq)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758 return NULL;
2759
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002760 return excepthandler(expression, e, suite_seq, LINENO(exc),
2761 exc->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762 }
Neal Norwitz84456bd2005-12-18 03:16:20 +00002763
2764 PyErr_Format(PyExc_SystemError,
2765 "wrong number of children for 'except' clause: %d",
2766 NCH(exc));
2767 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002768}
2769
2770static stmt_ty
2771ast_for_try_stmt(struct compiling *c, const node *n)
2772{
Neal Norwitzf599f422005-12-17 21:33:47 +00002773 const int nch = NCH(n);
2774 int n_except = (nch - 3)/3;
2775 asdl_seq *body, *orelse = NULL, *finally = NULL;
2776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777 REQ(n, try_stmt);
2778
Neal Norwitzf599f422005-12-17 21:33:47 +00002779 body = ast_for_suite(c, CHILD(n, 2));
2780 if (body == NULL)
2781 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782
Neal Norwitzf599f422005-12-17 21:33:47 +00002783 if (TYPE(CHILD(n, nch - 3)) == NAME) {
2784 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
2785 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
2786 /* we can assume it's an "else",
2787 because nch >= 9 for try-else-finally and
2788 it would otherwise have a type of except_clause */
2789 orelse = ast_for_suite(c, CHILD(n, nch - 4));
2790 if (orelse == NULL)
2791 return NULL;
2792 n_except--;
2793 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Neal Norwitzf599f422005-12-17 21:33:47 +00002795 finally = ast_for_suite(c, CHILD(n, nch - 1));
2796 if (finally == NULL)
2797 return NULL;
2798 n_except--;
2799 }
2800 else {
2801 /* we can assume it's an "else",
2802 otherwise it would have a type of except_clause */
2803 orelse = ast_for_suite(c, CHILD(n, nch - 1));
2804 if (orelse == NULL)
2805 return NULL;
2806 n_except--;
2807 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002809 else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
Neal Norwitz7b3d5e12005-11-13 21:17:28 +00002810 ast_error(n, "malformed 'try' statement");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 return NULL;
2812 }
Neal Norwitzf599f422005-12-17 21:33:47 +00002813
2814 if (n_except > 0) {
2815 int i;
2816 stmt_ty except_st;
2817 /* process except statements to create a try ... except */
2818 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
2819 if (handlers == NULL)
2820 return NULL;
2821
2822 for (i = 0; i < n_except; i++) {
2823 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
2824 CHILD(n, 5 + i * 3));
2825 if (!e)
2826 return NULL;
2827 asdl_seq_SET(handlers, i, e);
2828 }
2829
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002830 except_st = TryExcept(body, handlers, orelse, LINENO(n),
2831 n->n_col_offset, c->c_arena);
Neal Norwitzf599f422005-12-17 21:33:47 +00002832 if (!finally)
2833 return except_st;
2834
2835 /* if a 'finally' is present too, we nest the TryExcept within a
2836 TryFinally to emulate try ... except ... finally */
2837 body = asdl_seq_new(1, c->c_arena);
2838 if (body == NULL)
2839 return NULL;
2840 asdl_seq_SET(body, 0, except_st);
2841 }
2842
2843 /* must be a try ... finally (except clauses are in body, if any exist) */
2844 assert(finally != NULL);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002845 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846}
2847
Guido van Rossumc2e20742006-02-27 22:32:47 +00002848static expr_ty
2849ast_for_with_var(struct compiling *c, const node *n)
2850{
2851 REQ(n, with_var);
2852 if (strcmp(STR(CHILD(n, 0)), "as") != 0) {
2853 ast_error(n, "expected \"with [expr] as [var]\"");
2854 return NULL;
2855 }
2856 return ast_for_expr(c, CHILD(n, 1));
2857}
2858
2859/* with_stmt: 'with' test [ with_var ] ':' suite */
2860static stmt_ty
2861ast_for_with_stmt(struct compiling *c, const node *n)
2862{
2863 expr_ty context_expr, optional_vars = NULL;
2864 int suite_index = 3; /* skip 'with', test, and ':' */
2865 asdl_seq *suite_seq;
2866
2867 assert(TYPE(n) == with_stmt);
2868 context_expr = ast_for_expr(c, CHILD(n, 1));
2869 if (TYPE(CHILD(n, 2)) == with_var) {
2870 optional_vars = ast_for_with_var(c, CHILD(n, 2));
2871
2872 if (!optional_vars) {
2873 return NULL;
2874 }
2875 if (!set_context(optional_vars, Store, n)) {
2876 return NULL;
2877 }
2878 suite_index = 4;
2879 }
2880
2881 suite_seq = ast_for_suite(c, CHILD(n, suite_index));
2882 if (!suite_seq) {
2883 return NULL;
2884 }
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002885 return With(context_expr, optional_vars, suite_seq, LINENO(n),
2886 n->n_col_offset, c->c_arena);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002887}
2888
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889static stmt_ty
2890ast_for_classdef(struct compiling *c, const node *n)
2891{
2892 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893 asdl_seq *bases, *s;
2894
2895 REQ(n, classdef);
2896
2897 if (!strcmp(STR(CHILD(n, 1)), "None")) {
2898 ast_error(n, "assignment to None");
2899 return NULL;
2900 }
2901
2902 if (NCH(n) == 4) {
2903 s = ast_for_suite(c, CHILD(n, 3));
2904 if (!s)
2905 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002906 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2907 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 }
2909 /* check for empty base list */
2910 if (TYPE(CHILD(n,3)) == RPAR) {
2911 s = ast_for_suite(c, CHILD(n,5));
2912 if (!s)
2913 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002914 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), NULL, s, LINENO(n),
2915 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002916 }
2917
2918 /* else handle the base class list */
Neil Schemenauerc5dd10a2005-10-25 07:54:54 +00002919 bases = ast_for_class_bases(c, CHILD(n, 3));
2920 if (!bases)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002921 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922
2923 s = ast_for_suite(c, CHILD(n, 6));
Neal Norwitz84456bd2005-12-18 03:16:20 +00002924 if (!s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 return NULL;
Jeremy Hylton2f327c12006-04-04 04:00:23 +00002926 return ClassDef(NEW_IDENTIFIER(CHILD(n, 1)), bases, s, LINENO(n),
2927 n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928}
2929
2930static stmt_ty
2931ast_for_stmt(struct compiling *c, const node *n)
2932{
2933 if (TYPE(n) == stmt) {
2934 assert(NCH(n) == 1);
2935 n = CHILD(n, 0);
2936 }
2937 if (TYPE(n) == simple_stmt) {
2938 assert(num_stmts(n) == 1);
2939 n = CHILD(n, 0);
2940 }
2941 if (TYPE(n) == small_stmt) {
2942 REQ(n, small_stmt);
2943 n = CHILD(n, 0);
2944 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt
2945 | flow_stmt | import_stmt | global_stmt | exec_stmt
2946 | assert_stmt
2947 */
2948 switch (TYPE(n)) {
2949 case expr_stmt:
2950 return ast_for_expr_stmt(c, n);
2951 case print_stmt:
2952 return ast_for_print_stmt(c, n);
2953 case del_stmt:
2954 return ast_for_del_stmt(c, n);
2955 case pass_stmt:
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002956 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 case flow_stmt:
2958 return ast_for_flow_stmt(c, n);
2959 case import_stmt:
2960 return ast_for_import_stmt(c, n);
2961 case global_stmt:
2962 return ast_for_global_stmt(c, n);
2963 case exec_stmt:
2964 return ast_for_exec_stmt(c, n);
2965 case assert_stmt:
2966 return ast_for_assert_stmt(c, n);
2967 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002968 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2970 TYPE(n), NCH(n));
2971 return NULL;
2972 }
2973 }
2974 else {
2975 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
2976 | funcdef | classdef
2977 */
2978 node *ch = CHILD(n, 0);
2979 REQ(n, compound_stmt);
2980 switch (TYPE(ch)) {
2981 case if_stmt:
2982 return ast_for_if_stmt(c, ch);
2983 case while_stmt:
2984 return ast_for_while_stmt(c, ch);
2985 case for_stmt:
2986 return ast_for_for_stmt(c, ch);
2987 case try_stmt:
2988 return ast_for_try_stmt(c, ch);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002989 case with_stmt:
2990 return ast_for_with_stmt(c, ch);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991 case funcdef:
2992 return ast_for_funcdef(c, ch);
2993 case classdef:
2994 return ast_for_classdef(c, ch);
2995 default:
Neal Norwitz79792652005-11-14 04:25:03 +00002996 PyErr_Format(PyExc_SystemError,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997 "unhandled small_stmt: TYPE=%d NCH=%d\n",
2998 TYPE(n), NCH(n));
2999 return NULL;
3000 }
3001 }
3002}
3003
3004static PyObject *
3005parsenumber(const char *s)
3006{
3007 const char *end;
3008 long x;
3009 double dx;
3010#ifndef WITHOUT_COMPLEX
3011 Py_complex c;
3012 int imflag;
3013#endif
3014
3015 errno = 0;
3016 end = s + strlen(s) - 1;
3017#ifndef WITHOUT_COMPLEX
3018 imflag = *end == 'j' || *end == 'J';
3019#endif
3020 if (*end == 'l' || *end == 'L')
3021 return PyLong_FromString((char *)s, (char **)0, 0);
3022 if (s[0] == '0') {
3023 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0);
3024 if (x < 0 && errno == 0) {
3025 return PyLong_FromString((char *)s,
3026 (char **)0,
3027 0);
3028 }
3029 }
3030 else
3031 x = PyOS_strtol((char *)s, (char **)&end, 0);
3032 if (*end == '\0') {
3033 if (errno != 0)
3034 return PyLong_FromString((char *)s, (char **)0, 0);
3035 return PyInt_FromLong(x);
3036 }
3037 /* XXX Huge floats may silently fail */
3038#ifndef WITHOUT_COMPLEX
3039 if (imflag) {
3040 c.real = 0.;
3041 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003042 c.imag = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 PyFPE_END_PROTECT(c)
3044 return PyComplex_FromCComplex(c);
3045 }
3046 else
3047#endif
3048 {
3049 PyFPE_START_PROTECT("atof", return 0)
Fredrik Lundh24f0fa92005-12-29 20:35:52 +00003050 dx = PyOS_ascii_atof(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 PyFPE_END_PROTECT(dx)
3052 return PyFloat_FromDouble(dx);
3053 }
3054}
3055
3056static PyObject *
3057decode_utf8(const char **sPtr, const char *end, char* encoding)
3058{
3059#ifndef Py_USING_UNICODE
3060 Py_FatalError("decode_utf8 should not be called in this build.");
3061 return NULL;
3062#else
3063 PyObject *u, *v;
3064 char *s, *t;
3065 t = s = (char *)*sPtr;
3066 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3067 while (s < end && (*s & 0x80)) s++;
3068 *sPtr = s;
3069 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3070 if (u == NULL)
3071 return NULL;
3072 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3073 Py_DECREF(u);
3074 return v;
3075#endif
3076}
3077
3078static PyObject *
3079decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
3080{
3081 PyObject *v, *u;
3082 char *buf;
3083 char *p;
3084 const char *end;
3085 if (encoding == NULL) {
3086 buf = (char *)s;
3087 u = NULL;
3088 } else if (strcmp(encoding, "iso-8859-1") == 0) {
3089 buf = (char *)s;
3090 u = NULL;
3091 } else {
3092 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
3093 u = PyString_FromStringAndSize((char *)NULL, len * 4);
3094 if (u == NULL)
3095 return NULL;
3096 p = buf = PyString_AsString(u);
3097 end = s + len;
3098 while (s < end) {
3099 if (*s == '\\') {
3100 *p++ = *s++;
3101 if (*s & 0x80) {
3102 strcpy(p, "u005c");
3103 p += 5;
3104 }
3105 }
3106 if (*s & 0x80) { /* XXX inefficient */
3107 PyObject *w;
3108 char *r;
Martin v. Löwis66851282006-04-22 11:40:03 +00003109 Py_ssize_t rn, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003110 w = decode_utf8(&s, end, "utf-16-be");
3111 if (w == NULL) {
3112 Py_DECREF(u);
3113 return NULL;
3114 }
3115 r = PyString_AsString(w);
3116 rn = PyString_Size(w);
3117 assert(rn % 2 == 0);
3118 for (i = 0; i < rn; i += 2) {
3119 sprintf(p, "\\u%02x%02x",
3120 r[i + 0] & 0xFF,
3121 r[i + 1] & 0xFF);
3122 p += 6;
3123 }
3124 Py_DECREF(w);
3125 } else {
3126 *p++ = *s++;
3127 }
3128 }
3129 len = p - buf;
3130 s = buf;
3131 }
3132 if (rawmode)
3133 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3134 else
3135 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3136 Py_XDECREF(u);
3137 return v;
3138}
3139
3140/* s is a Python string literal, including the bracketing quote characters,
3141 * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3142 * parsestr parses it, and returns the decoded Python string object.
3143 */
3144static PyObject *
3145parsestr(const char *s, const char *encoding)
3146{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 size_t len;
Neal Norwitz30b5c5d2005-12-19 06:05:18 +00003148 int quote = Py_CHARMASK(*s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149 int rawmode = 0;
3150 int need_encoding;
3151 int unicode = 0;
3152
3153 if (isalpha(quote) || quote == '_') {
3154 if (quote == 'u' || quote == 'U') {
3155 quote = *++s;
3156 unicode = 1;
3157 }
3158 if (quote == 'r' || quote == 'R') {
3159 quote = *++s;
3160 rawmode = 1;
3161 }
3162 }
3163 if (quote != '\'' && quote != '\"') {
3164 PyErr_BadInternalCall();
3165 return NULL;
3166 }
3167 s++;
3168 len = strlen(s);
3169 if (len > INT_MAX) {
3170 PyErr_SetString(PyExc_OverflowError,
3171 "string to parse is too long");
3172 return NULL;
3173 }
3174 if (s[--len] != quote) {
3175 PyErr_BadInternalCall();
3176 return NULL;
3177 }
3178 if (len >= 4 && s[0] == quote && s[1] == quote) {
3179 s += 2;
3180 len -= 2;
3181 if (s[--len] != quote || s[--len] != quote) {
3182 PyErr_BadInternalCall();
3183 return NULL;
3184 }
3185 }
3186#ifdef Py_USING_UNICODE
3187 if (unicode || Py_UnicodeFlag) {
3188 return decode_unicode(s, len, rawmode, encoding);
3189 }
3190#endif
3191 need_encoding = (encoding != NULL &&
3192 strcmp(encoding, "utf-8") != 0 &&
3193 strcmp(encoding, "iso-8859-1") != 0);
3194 if (rawmode || strchr(s, '\\') == NULL) {
3195 if (need_encoding) {
3196#ifndef Py_USING_UNICODE
3197 /* This should not happen - we never see any other
3198 encoding. */
Jeremy Hylton2f327c12006-04-04 04:00:23 +00003199 Py_FatalError(
3200 "cannot deal with encodings in this build.");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003201#else
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003202 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203 if (u == NULL)
3204 return NULL;
3205 v = PyUnicode_AsEncodedString(u, encoding, NULL);
3206 Py_DECREF(u);
3207 return v;
3208#endif
3209 } else {
3210 return PyString_FromStringAndSize(s, len);
3211 }
3212 }
3213
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003214 return PyString_DecodeEscape(s, len, NULL, unicode,
3215 need_encoding ? encoding : NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003216}
3217
3218/* Build a Python string object out of a STRING atom. This takes care of
3219 * compile-time literal catenation, calling parsestr() on each piece, and
3220 * pasting the intermediate results together.
3221 */
3222static PyObject *
3223parsestrplus(struct compiling *c, const node *n)
3224{
3225 PyObject *v;
3226 int i;
3227 REQ(CHILD(n, 0), STRING);
3228 if ((v = parsestr(STR(CHILD(n, 0)), c->c_encoding)) != NULL) {
3229 /* String literal concatenation */
3230 for (i = 1; i < NCH(n); i++) {
3231 PyObject *s;
3232 s = parsestr(STR(CHILD(n, i)), c->c_encoding);
3233 if (s == NULL)
3234 goto onError;
3235 if (PyString_Check(v) && PyString_Check(s)) {
3236 PyString_ConcatAndDel(&v, s);
3237 if (v == NULL)
3238 goto onError;
3239 }
3240#ifdef Py_USING_UNICODE
3241 else {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003242 PyObject *temp = PyUnicode_Concat(v, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243 Py_DECREF(s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244 Py_DECREF(v);
3245 v = temp;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003246 if (v == NULL)
3247 goto onError;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248 }
3249#endif
3250 }
3251 }
3252 return v;
3253
3254 onError:
3255 Py_XDECREF(v);
3256 return NULL;
3257}