1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/*
2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * This file includes functions to transform a concrete syntax tree (CST) to
3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * an abstract syntax tree (AST).  The main function is PyAST_FromNode().
4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel *
5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python.h"
7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python-ast.h"
8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "grammar.h"
9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "node.h"
10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "pyarena.h"
11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "ast.h"
12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "token.h"
13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "parsetok.h"
14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "graminit.h"
15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <assert.h>
17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Data structure used internally */
19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstruct compiling {
20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *c_encoding; /* source encoding */
21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int c_future_unicode; /* __future__ unicode literals flag */
22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyArena *c_arena; /* arena for allocating memeory */
23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const char *c_filename; /* filename */
24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel};
25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *seq_for_testlist(struct compiling *, const node *);
27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty ast_for_expr(struct compiling *, const node *);
28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty ast_for_stmt(struct compiling *, const node *);
29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *ast_for_suite(struct compiling *, const node *);
30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *ast_for_exprlist(struct compiling *, const node *,
31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                  expr_context_ty);
32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty ast_for_testlist(struct compiling *, const node *);
33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty ast_for_testlist_comp(struct compiling *, const node *);
35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Note different signature for ast_for_call */
37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *parsenumber(struct compiling *, const char *);
40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *parsestr(struct compiling *, const node *n, const char *);
41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *parsestrplus(struct compiling *, const node *n);
42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef LINENO
44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LINENO(n)       ((n)->n_lineno)
45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define COMP_GENEXP 0
48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define COMP_SETCOMP  1
49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic identifier
51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielnew_identifier(const char* n, PyArena *arena) {
52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject* id = PyString_InternFromString(n);
53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (id != NULL)
54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyArena_AddPyObject(arena, id);
55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return id;
56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* This routine provides an invalid object for the syntax error.
61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The outermost routine must unpack this error and create the
62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   proper object.  We do this so that we don't have to pass
63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   the filename to everything function.
64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   XXX Maybe we should just pass the filename...
66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_error(const node *n, const char *errstr)
70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!u)
73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetObject(PyExc_SyntaxError, u);
75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(u);
76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_error_finish(const char *filename)
81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *type, *value, *tback, *errstr, *loc, *tmp;
83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long lineno;
84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(PyErr_Occurred());
86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Fetch(&type, &value, &tback);
90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    errstr = PyTuple_GetItem(value, 0);
91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!errstr)
92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(errstr);
94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (lineno == -1) {
96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(errstr);
97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(value);
100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    loc = PyErr_ProgramText(filename, lineno);
102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!loc) {
103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(Py_None);
104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        loc = Py_None;
105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(loc);
108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!tmp) {
109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(errstr);
110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    value = PyTuple_Pack(2, errstr, tmp);
113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(errstr);
114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(tmp);
115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!value)
116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Restore(type, value, tback);
118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_warn(struct compiling *c, const node *n, char *msg)
122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           NULL, NULL) < 0) {
125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* if -Werr, change it to a SyntaxError */
126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ast_error(n, msg);
128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 1;
131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielforbidden_check(struct compiling *c, const node *n, const char *x)
135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!strcmp(x, "None"))
137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_error(n, "cannot assign to None");
138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!strcmp(x, "__debug__"))
139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_error(n, "cannot assign to __debug__");
140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (Py_Py3kWarningFlag) {
141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!(strcmp(x, "True") && strcmp(x, "False")) &&
142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return 0;
144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!strcmp(x, "nonlocal") &&
145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            !ast_warn(c, n, "nonlocal is a keyword in 3.x"))
146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return 0;
147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 1;
149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* num_stmts() returns number of contained statements.
152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Use this routine to determine how big a sequence is needed for
154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   the statements in a parse tree.  Its raison d'etre is this bit of
155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   grammar:
156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   stmt: simple_stmt | compound_stmt
158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   A simple_stmt can contain multiple small_stmt elements joined
161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   by semicolons.  If the arg is a simple_stmt, the number of
162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   small_stmt elements is returned.
163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielnum_stmts(const node *n)
167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, l;
169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(n)) {
172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case single_input:
173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(CHILD(n, 0)) == NEWLINE)
174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return 0;
175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return num_stmts(CHILD(n, 0));
177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case file_input:
178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            l = 0;
179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(n); i++) {
180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ch = CHILD(n, i);
181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (TYPE(ch) == stmt)
182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    l += num_stmts(ch);
183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return l;
185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case stmt:
186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return num_stmts(CHILD(n, 0));
187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case compound_stmt:
188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return 1;
189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case simple_stmt:
190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case suite:
192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1)
193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return num_stmts(CHILD(n, 0));
194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                l = 0;
196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (i = 2; i < (NCH(n) - 1); i++)
197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    l += num_stmts(CHILD(n, i));
198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return l;
199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default: {
201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            char buf[128];
202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            sprintf(buf, "Non-statement found: %d %d",
204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    TYPE(n), NCH(n));
205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_FatalError(buf);
206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(0);
209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Transform the CST rooted at node * to the appropriate AST
213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmod_ty
216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               PyArena *arena)
218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, j, k, num;
220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *stmts = NULL;
221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    stmt_ty s;
222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    struct compiling c;
224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        c.c_encoding = "utf-8";
227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(n) == encoding_decl) {
228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ast_error(n, "encoding declaration in Unicode string");
229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto error;
230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (TYPE(n) == encoding_decl) {
232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        c.c_encoding = STR(n);
233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        c.c_encoding = NULL;
236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    c.c_arena = arena;
239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    c.c_filename = filename;
240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    k = 0;
242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(n)) {
243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case file_input:
244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stmts = asdl_seq_new(num_stmts(n), arena);
245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!stmts)
246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(n) - 1; i++) {
248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ch = CHILD(n, i);
249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (TYPE(ch) == NEWLINE)
250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    continue;
251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(ch, stmt);
252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                num = num_stmts(ch);
253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (num == 1) {
254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    s = ast_for_stmt(&c, ch);
255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!s)
256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        goto error;
257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(stmts, k++, s);
258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else {
260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ch = CHILD(ch, 0);
261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    REQ(ch, simple_stmt);
262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    for (j = 0; j < num; j++) {
263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        s = ast_for_stmt(&c, CHILD(ch, j * 2));
264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (!s)
265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            goto error;
266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        asdl_seq_SET(stmts, k++, s);
267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Module(stmts, arena);
271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case eval_input: {
272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty testlist_ast;
273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX Why not comp_for here? */
275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!testlist_ast)
277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto error;
278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Expression(testlist_ast, arena);
279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case single_input:
281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(CHILD(n, 0)) == NEWLINE) {
282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                stmts = asdl_seq_new(1, arena);
283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!stmts)
284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto error;
285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            arena));
287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!asdl_seq_GET(stmts, 0))
288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto error;
289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Interactive(stmts, arena);
290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                num = num_stmts(n);
294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                stmts = asdl_seq_new(num, arena);
295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!stmts)
296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto error;
297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (num == 1) {
298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    s = ast_for_stmt(&c, n);
299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!s)
300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        goto error;
301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(stmts, 0, s);
302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else {
304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* Only a simple_stmt can contain multiple statements. */
305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    REQ(n, simple_stmt);
306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    for (i = 0; i < NCH(n); i += 2) {
307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (TYPE(CHILD(n, i)) == NEWLINE)
308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            break;
309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        s = ast_for_stmt(&c, CHILD(n, i));
310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (!s)
311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            goto error;
312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        asdl_seq_SET(stmts, i / 2, s);
313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Interactive(stmts, arena);
317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "invalid node %d for PyAST_FromNode", TYPE(n));
321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto error;
322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel error:
324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ast_error_finish(filename);
325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic operator_ty
332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_operator(const node *n)
333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(n)) {
335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case VBAR:
336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitOr;
337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CIRCUMFLEX:
338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitXor;
339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case AMPER:
340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitAnd;
341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LEFTSHIFT:
342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return LShift;
343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case RIGHTSHIFT:
344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return RShift;
345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PLUS:
346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Add;
347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case MINUS:
348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Sub;
349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STAR:
350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Mult;
351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SLASH:
352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Div;
353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DOUBLESLASH:
354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return FloorDiv;
355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PERCENT:
356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Mod;
357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return (operator_ty)0;
359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Set the context ctx for expr_ty e, recursively traversing e.
363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Only sets context for expr kinds that "can appear in assignment context"
365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (according to ../Parser/Python.asdl).  For other expr kinds, it sets
366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   an appropriate syntax error and returns false.
367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielset_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *s = NULL;
373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If a particular expression type can't be used for assign / delete,
374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       set expr_name to its name and an error message will be generated.
375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const char* expr_name = NULL;
377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* The ast defines augmented store and load contexts, but the
379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       implementation here doesn't actually use them.  The code may be
380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       a little more complex than necessary as a result.  It also means
381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       that expressions in an augmented assignment have a Store context.
382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       Consider restructuring so that augmented assignment uses
383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       set_context(), too.
384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(ctx != AugStore && ctx != AugLoad);
386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (e->kind) {
388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Attribute_kind:
389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (ctx == Store && !forbidden_check(c, n,
390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyBytes_AS_STRING(e->v.Attribute.attr)))
391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return 0;
392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e->v.Attribute.ctx = ctx;
393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Subscript_kind:
395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e->v.Subscript.ctx = ctx;
396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Name_kind:
398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (ctx == Store && !forbidden_check(c, n,
399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyBytes_AS_STRING(e->v.Name.id)))
400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return 0;
401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e->v.Name.ctx = ctx;
402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case List_kind:
404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e->v.List.ctx = ctx;
405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            s = e->v.List.elts;
406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Tuple_kind:
408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (asdl_seq_LEN(e->v.Tuple.elts))  {
409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                e->v.Tuple.ctx = ctx;
410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                s = e->v.Tuple.elts;
411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_name = "()";
414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Lambda_kind:
417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "lambda";
418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Call_kind:
420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "function call";
421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BoolOp_kind:
423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BinOp_kind:
424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UnaryOp_kind:
425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "operator";
426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case GeneratorExp_kind:
428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "generator expression";
429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Yield_kind:
431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "yield expression";
432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case ListComp_kind:
434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "list comprehension";
435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SetComp_kind:
437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "set comprehension";
438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DictComp_kind:
440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "dict comprehension";
441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Dict_kind:
443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Set_kind:
444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Num_kind:
445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Str_kind:
446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "literal";
447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Compare_kind:
449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "comparison";
450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case Repr_kind:
452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "repr";
453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case IfExp_kind:
455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_name = "conditional expression";
456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "unexpected expression in assignment %d (line %d)",
460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         e->kind, e->lineno);
461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return 0;
462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Check for error string set by switch */
464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (expr_name) {
465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char buf[300];
466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyOS_snprintf(buf, sizeof(buf),
467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      "can't %s %s",
468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      ctx == Store ? "assign to" : "delete",
469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      expr_name);
470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_error(n, buf);
471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If the LHS is a list or tuple, we need to set the assignment
474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       context for all the contained elements.
475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (s) {
477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < asdl_seq_LEN(s); i++) {
480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return 0;
482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 1;
485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic operator_ty
488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_augassign(struct compiling *c, const node *n)
489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, augassign);
491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = CHILD(n, 0);
492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (STR(n)[0]) {
493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '+':
494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Add;
495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '-':
496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Sub;
497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '/':
498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (STR(n)[1] == '/')
499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return FloorDiv;
500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Div;
502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '%':
503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Mod;
504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '<':
505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return LShift;
506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '>':
507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return RShift;
508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '&':
509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitAnd;
510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '^':
511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitXor;
512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '|':
513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BitOr;
514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case '*':
515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (STR(n)[1] == '*')
516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Pow;
517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Mult;
519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return (operator_ty)0;
522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic cmpop_ty
526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_comp_op(struct compiling *c, const node *n)
527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               |'is' 'not'
530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, comp_op);
532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1) {
533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(n)) {
535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case LESS:
536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Lt;
537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case GREATER:
538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Gt;
539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case EQEQUAL:                       /* == */
540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Eq;
541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case LESSEQUAL:
542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return LtE;
543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case GREATEREQUAL:
544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return GtE;
545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case NOTEQUAL:
546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NotEq;
547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case NAME:
548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (strcmp(STR(n), "in") == 0)
549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return In;
550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (strcmp(STR(n), "is") == 0)
551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return Is;
552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             STR(n));
555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return (cmpop_ty)0;
556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(n) == 2) {
559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* handle "not in" and "is not" */
560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(CHILD(n, 0))) {
561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case NAME:
562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (strcmp(STR(CHILD(n, 1)), "in") == 0)
563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NotIn;
564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (strcmp(STR(CHILD(n, 0)), "is") == 0)
565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return IsNot;
566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             STR(CHILD(n, 0)), STR(CHILD(n, 1)));
569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return (cmpop_ty)0;
570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 NCH(n));
574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return (cmpop_ty)0;
575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *
578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielseq_for_testlist(struct compiling *c, const node *n)
579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist: test (',' test)* [','] */
581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *seq;
582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expression;
583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(TYPE(n) == testlist ||
585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TYPE(n) == listmaker ||
586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TYPE(n) == testlist_comp ||
587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TYPE(n) == testlist_safe ||
588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TYPE(n) == testlist1);
589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!seq)
592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i += 2) {
595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, i));
598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(i / 2 < seq->size);
602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(seq, i / 2, expression);
603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return seq;
605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcompiler_complex_args(struct compiling *c, const node *n)
609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, len = (NCH(n) + 1) / 2;
611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty result;
612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *args = asdl_seq_new(len, c->c_arena);
613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!args)
614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* fpdef: NAME | '(' fplist ')'
617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       fplist: fpdef (',' fpdef)* [',']
618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, fplist);
620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < len; i++) {
621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *arg_id;
622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const node *fpdef_node = CHILD(n, 2*i);
623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const node *child;
624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty arg;
625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielset_name:
626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* fpdef_node is either a NAME or an fplist */
627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        child = CHILD(fpdef_node, 0);
628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(child) == NAME) {
629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!forbidden_check(c, n, STR(child)))
630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg_id = NEW_IDENTIFIER(child);
632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!arg_id)
633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       c->c_arena);
636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert(TYPE(fpdef_node) == fpdef);
639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            child = CHILD(fpdef_node, 1);
641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert(TYPE(child) == fplist);
642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* NCH == 1 means we have (x), we need to elide the extra parens */
643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(child) == 1) {
644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                fpdef_node = CHILD(child, 0);
645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(TYPE(fpdef_node) == fpdef);
646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto set_name;
647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg = compiler_complex_args(c, child);
649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(args, i, arg);
651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!set_context(c, result, Store, n))
655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Create AST for argument list. */
661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic arguments_ty
663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_arguments(struct compiling *c, const node *n)
664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* parameters: '(' [varargslist] ')'
666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *args, *defaults;
671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    identifier vararg = NULL, kwarg = NULL;
672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == parameters) {
675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 2) /* () as argument list */
676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return arguments(NULL, NULL, NULL, NULL, c->c_arena);
677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 1);
678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, varargslist);
680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* first count the number of normal args & defaults */
682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i++) {
683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, i);
684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == fpdef)
685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_args++;
686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == EQUAL)
687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_defaults++;
688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!args && n_args)
691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!defaults && n_defaults)
694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* fpdef: NAME | '(' fplist ')'
697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       fplist: fpdef (',' fpdef)* [',']
698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    i = 0;
700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    j = 0;  /* index for defaults */
701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    k = 0;  /* index for args */
702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (i < NCH(n)) {
703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, i);
704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(ch)) {
705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case fpdef: {
706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int complex_args = 0, parenthesized = 0;
707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            handle_fpdef:
708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   anything other than EQUAL or a comma? */
710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* XXX Should NCH(n) check be made a separate check? */
711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!expression)
714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    assert(defaults != NULL);
716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(defaults, j++, expression);
717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    i += 2;
718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    found_default = 1;
719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else if (found_default) {
721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* def f((x)=4): pass should raise an error.
722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       def f((x, (y))): pass will just incur the tuple unpacking warning. */
723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (parenthesized && !complex_args) {
724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ast_error(n, "parenthesized arg with default");
725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(n,
728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "non-default argument follows default argument");
729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (NCH(ch) == 3) {
732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ch = CHILD(ch, 1);
733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* def foo((x)): is not complex, special case. */
734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (NCH(ch) != 1) {
735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        /* We have complex arguments, setup for unpacking. */
736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (Py_Py3kWarningFlag && !ast_warn(c, ch,
737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            "tuple parameter unpacking has been removed in 3.x"))
738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            return NULL;
739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        complex_args = 1;
740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (!asdl_seq_GET(args, k-1))
742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                return NULL;
743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    } else {
744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        /* def foo((x)): setup for checking NAME below. */
745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        /* Loop because there can be many parens and tuple
746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           unpacking mixed in. */
747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        parenthesized = 1;
748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ch = CHILD(ch, 0);
749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        assert(TYPE(ch) == fpdef);
750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        goto handle_fpdef;
751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (TYPE(CHILD(ch, 0)) == NAME) {
754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyObject *id;
755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    expr_ty name;
756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    id = NEW_IDENTIFIER(CHILD(ch, 0));
759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!id)
760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    name = Name(id, Param, LINENO(ch), ch->n_col_offset,
762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                c->c_arena);
763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!name)
764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(args, k++, name);
766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i += 2; /* the name and the comma */
769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (parenthesized && Py_Py3kWarningFlag &&
770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    !ast_warn(c, ch, "parenthesized argument names "
771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              "are invalid in 3.x"))
772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case STAR:
777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                vararg = NEW_IDENTIFIER(CHILD(n, i+1));
780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!vararg)
781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i += 3;
783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case DOUBLESTAR:
785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!kwarg)
789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i += 3;
791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError,
794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "unexpected node in varargslist: %d @ %d",
795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             TYPE(ch), i);
796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return arguments(args, vararg, kwarg, defaults, c->c_arena);
801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_dotted_name(struct compiling *c, const node *n)
805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty e;
807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    identifier id;
808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int lineno, col_offset;
809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, dotted_name);
812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    lineno = LINENO(n);
814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    col_offset = n->n_col_offset;
815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    id = NEW_IDENTIFIER(CHILD(n, 0));
817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!id)
818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    e = Name(id, Load, lineno, col_offset, c->c_arena);
820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!e)
821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 2; i < NCH(n); i+=2) {
824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        id = NEW_IDENTIFIER(CHILD(n, i));
825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!id)
826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!e)
829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return e;
833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_decorator(struct compiling *c, const node *n)
837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty d = NULL;
840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty name_expr;
841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, decorator);
843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(CHILD(n, 0), AT);
844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(RCHILD(n, -1), NEWLINE);
845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    name_expr = ast_for_dotted_name(c, CHILD(n, 1));
847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!name_expr)
848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 3) { /* No arguments */
851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = name_expr;
852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name_expr = NULL;
853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(n) == 5) { /* Call with no arguments */
855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 n->n_col_offset, c->c_arena);
857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!d)
858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name_expr = NULL;
860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = ast_for_call(c, CHILD(n, 3), name_expr);
863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!d)
864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name_expr = NULL;
866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return d;
869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq*
872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_decorators(struct compiling *c, const node *n)
873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq* decorator_seq;
875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty d;
876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, decorators);
879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!decorator_seq)
881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i++) {
884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = ast_for_decorator(c, CHILD(n, i));
885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!d)
886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(decorator_seq, i, d);
888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return decorator_seq;
890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* funcdef: 'def' NAME parameters ':' suite */
896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    identifier name;
897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    arguments_ty args;
898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *body;
899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int name_i = 1;
900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, funcdef);
902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    name = NEW_IDENTIFIER(CHILD(n, name_i));
904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!name)
905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    args = ast_for_arguments(c, CHILD(n, name_i + 1));
909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!args)
910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    body = ast_for_suite(c, CHILD(n, name_i + 3));
912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!body)
913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return FunctionDef(name, args, body, decorator_seq, LINENO(n),
916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       n->n_col_offset, c->c_arena);
917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_decorated(struct compiling *c, const node *n)
921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* decorated: decorators (classdef | funcdef) */
923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    stmt_ty thing = NULL;
924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *decorator_seq = NULL;
925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, decorated);
927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    decorator_seq = ast_for_decorators(c, CHILD(n, 0));
929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!decorator_seq)
930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      return NULL;
931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(TYPE(CHILD(n, 1)) == funcdef ||
933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TYPE(CHILD(n, 1)) == classdef);
934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, 1)) == funcdef) {
936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (TYPE(CHILD(n, 1)) == classdef) {
938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* we count the decorators in when talking about the class' or
941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       function's line number */
942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (thing) {
943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        thing->lineno = LINENO(n);
944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        thing->col_offset = n->n_col_offset;
945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return thing;
947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_lambdef(struct compiling *c, const node *n)
951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* lambdef: 'lambda' [varargslist] ':' test */
953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    arguments_ty args;
954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expression;
955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 3) {
957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!args)
959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 2));
961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        args = ast_for_arguments(c, CHILD(n, 1));
966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!args)
967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 3));
969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_ifexpr(struct compiling *c, const node *n)
978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* test: or_test 'if' or_test 'else' test */
980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expression, body, orelse;
981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) == 5);
983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    body = ast_for_expr(c, CHILD(n, 0));
984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!body)
985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expression = ast_for_expr(c, CHILD(n, 2));
987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!expression)
988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    orelse = ast_for_expr(c, CHILD(n, 4));
990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!orelse)
991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 c->c_arena);
994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   so there is only a single version.  Possibly for loops can also re-use
998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   the code.
999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Count the number of 'for' loop in a list comprehension.
1002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Helper for ast_for_listcomp().
1004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
1007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcount_list_fors(struct compiling *c, const node *n)
1008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_fors = 0;
1010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch = CHILD(n, 1);
1011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel count_list_for:
1013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n_fors++;
1014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(ch, list_for);
1015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(ch) == 5)
1016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(ch, 4);
1017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return n_fors;
1019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel count_list_iter:
1020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(ch, list_iter);
1021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ch = CHILD(ch, 0);
1022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(ch) == list_for)
1023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto count_list_for;
1024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(ch) == list_if) {
1025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(ch) == 3) {
1026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(ch, 2);
1027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto count_list_iter;
1028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return n_fors;
1031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Should never be reached */
1034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
1035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return -1;
1036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Count the number of 'if' statements in a list comprehension.
1039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Helper for ast_for_listcomp().
1041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
1044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcount_list_ifs(struct compiling *c, const node *n)
1045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_ifs = 0;
1047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel count_list_iter:
1049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, list_iter);
1050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, 0)) == list_for)
1051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return n_ifs;
1052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = CHILD(n, 0);
1053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, list_if);
1054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n_ifs++;
1055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 2)
1056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return n_ifs;
1057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = CHILD(n, 2);
1058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    goto count_list_iter;
1059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_listcomp(struct compiling *c, const node *n)
1063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* listmaker: test ( list_for | (',' test)* [','] )
1065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       list_for: 'for' exprlist 'in' testlist_safe [list_iter]
1066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       list_iter: list_for | list_if
1067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       list_if: 'if' test [list_iter]
1068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       testlist_safe: test [(',' test)+ [',']]
1069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty elt, first;
1071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *listcomps;
1072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, n_fors;
1073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
1074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, listmaker);
1076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) > 1);
1077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    elt = ast_for_expr(c, CHILD(n, 0));
1079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!elt)
1080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n_fors = count_list_fors(c, n);
1083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_fors == -1)
1084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    listcomps = asdl_seq_new(n_fors, c->c_arena);
1087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!listcomps)
1088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ch = CHILD(n, 1);
1091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n_fors; i++) {
1092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        comprehension_ty lc;
1093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *t;
1094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
1095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *for_ch;
1096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(ch, list_for);
1098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for_ch = CHILD(ch, 1);
1100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        t = ast_for_exprlist(c, for_ch, Store);
1101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!t)
1102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_testlist(c, CHILD(ch, 3));
1104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
1105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Check the # of children rather than the length of t, since
1108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           [x for x, in ... ] has 1 element in t, but still requires a Tuple.
1109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
1110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        first = (expr_ty)asdl_seq_GET(t, 0);
1111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(for_ch) == 1)
1112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            lc = comprehension(first, expression, NULL, c->c_arena);
1113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            lc = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     c->c_arena),
1116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               expression, NULL, c->c_arena);
1117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!lc)
1118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(ch) == 5) {
1121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int j, n_ifs;
1122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *ifs;
1123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty list_for_expr;
1124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(ch, 4);
1126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_ifs = count_list_ifs(c, ch);
1127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (n_ifs == -1)
1128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ifs = asdl_seq_new(n_ifs, c->c_arena);
1131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!ifs)
1132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < n_ifs; j++) {
1135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(ch, list_iter);
1136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ch = CHILD(ch, 0);
1137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(ch, list_if);
1138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                list_for_expr = ast_for_expr(c, CHILD(ch, 1));
1140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!list_for_expr)
1141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(ifs, j, list_for_expr);
1144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (NCH(ch) == 3)
1145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ch = CHILD(ch, 2);
1146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* on exit, must guarantee that ch is a list_for */
1148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(ch) == list_iter)
1149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ch = CHILD(ch, 0);
1150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            lc->ifs = ifs;
1151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(listcomps, i, lc);
1153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
1156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/*
1159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Count the number of 'for' loops in a comprehension.
1160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Helper for ast_for_comprehension().
1162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
1165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcount_comp_fors(struct compiling *c, const node *n)
1166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_fors = 0;
1168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  count_comp_for:
1170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n_fors++;
1171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, comp_for);
1172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 5)
1173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 4);
1174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return n_fors;
1176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  count_comp_iter:
1177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, comp_iter);
1178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = CHILD(n, 0);
1179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == comp_for)
1180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto count_comp_for;
1181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(n) == comp_if) {
1182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 3) {
1183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = CHILD(n, 2);
1184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto count_comp_iter;
1185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return n_fors;
1188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Should never be reached */
1191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_SystemError,
1192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "logic error in count_comp_fors");
1193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return -1;
1194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Count the number of 'if' statements in a comprehension.
1197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Helper for ast_for_comprehension().
1199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
1202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcount_comp_ifs(struct compiling *c, const node *n)
1203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_ifs = 0;
1205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (1) {
1207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(n, comp_iter);
1208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(CHILD(n, 0)) == comp_for)
1209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return n_ifs;
1210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
1211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(n, comp_if);
1212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n_ifs++;
1213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 2)
1214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return n_ifs;
1215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 2);
1216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *
1220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_comprehension(struct compiling *c, const node *n)
1221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, n_fors;
1223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *comps;
1224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n_fors = count_comp_fors(c, n);
1226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_fors == -1)
1227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    comps = asdl_seq_new(n_fors, c->c_arena);
1230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!comps)
1231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n_fors; i++) {
1234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        comprehension_ty comp;
1235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *t;
1236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression, first;
1237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *for_ch;
1238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(n, comp_for);
1240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for_ch = CHILD(n, 1);
1242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        t = ast_for_exprlist(c, for_ch, Store);
1243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!t)
1244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 3));
1246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
1247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Check the # of children rather than the length of t, since
1250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           (x for x, in ...) has 1 element in t, but still requires a Tuple. */
1251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        first = (expr_ty)asdl_seq_GET(t, 0);
1252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(for_ch) == 1)
1253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            comp = comprehension(first, expression, NULL, c->c_arena);
1254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
1256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     c->c_arena),
1257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               expression, NULL, c->c_arena);
1258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!comp)
1259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 5) {
1262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int j, n_ifs;
1263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *ifs;
1264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = CHILD(n, 4);
1266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_ifs = count_comp_ifs(c, n);
1267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (n_ifs == -1)
1268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ifs = asdl_seq_new(n_ifs, c->c_arena);
1271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!ifs)
1272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < n_ifs; j++) {
1275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(n, comp_iter);
1276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(n, comp_if);
1278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expression = ast_for_expr(c, CHILD(n, 1));
1280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
1281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(ifs, j, expression);
1283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (NCH(n) == 3)
1284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    n = CHILD(n, 2);
1285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* on exit, must guarantee that n is a comp_for */
1287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(n) == comp_iter)
1288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            comp->ifs = ifs;
1290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(comps, i, comp);
1292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return comps;
1294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_itercomp(struct compiling *c, const node *n, int type)
1298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty elt;
1300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *comps;
1301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) > 1);
1303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    elt = ast_for_expr(c, CHILD(n, 0));
1305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!elt)
1306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    comps = ast_for_comprehension(c, CHILD(n, 1));
1309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!comps)
1310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (type == COMP_GENEXP)
1313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (type == COMP_SETCOMP)
1315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
1316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Should never happen */
1318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_dictcomp(struct compiling *c, const node *n)
1323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty key, value;
1325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *comps;
1326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) > 3);
1328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(CHILD(n, 1), COLON);
1329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    key = ast_for_expr(c, CHILD(n, 0));
1331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!key)
1332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    value = ast_for_expr(c, CHILD(n, 2));
1335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!value)
1336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    comps = ast_for_comprehension(c, CHILD(n, 3));
1339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!comps)
1340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
1343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_genexp(struct compiling *c, const node *n)
1347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
1349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ast_for_itercomp(c, n, COMP_GENEXP);
1350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_setcomp(struct compiling *c, const node *n)
1354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(TYPE(n) == (dictorsetmaker));
1356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ast_for_itercomp(c, n, COMP_SETCOMP);
1357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_atom(struct compiling *c, const node *n)
1361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [listmaker] ']'
1363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
1364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch = CHILD(n, 0);
1366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(ch)) {
1368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case NAME: {
1369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* All names start in Load context, but may later be
1370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           changed. */
1371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *name = NEW_IDENTIFIER(ch);
1372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!name)
1373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
1375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case STRING: {
1377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *str = parsestrplus(c, n);
1378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!str) {
1379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
1380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
1381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *type, *value, *tback, *errstr;
1382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Fetch(&type, &value, &tback);
1383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                errstr = PyObject_Str(value);
1384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (errstr) {
1385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    char *s = "";
1386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    char buf[128];
1387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    s = PyString_AsString(errstr);
1388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
1389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(n, buf);
1390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(errstr);
1391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                } else {
1392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(n, "(unicode error) unknown error");
1393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(type);
1395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(value);
1396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_XDECREF(tback);
1397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyArena_AddPyObject(c->c_arena, str);
1402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
1403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case NUMBER: {
1405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *pynum = parsenumber(c, STR(ch));
1406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!pynum)
1407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyArena_AddPyObject(c->c_arena, pynum);
1410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
1411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case LPAR: /* some parenthesized expressions */
1413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, 1);
1414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == RPAR)
1416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == yield_expr)
1419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_expr(c, ch);
1420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_for_testlist_comp(c, ch);
1422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case LSQB: /* list (or list comprehension) */
1423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, 1);
1424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == RSQB)
1426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
1427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(ch, listmaker);
1429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *elts = seq_for_testlist(c, ch);
1431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!elts)
1432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_listcomp(c, ch);
1438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case LBRACE: {
1439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* dictorsetmaker:
1440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         *    (test ':' test (comp_for | (',' test ':' test)* [','])) |
1441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         *    (test (comp_for | (',' test)* [',']))
1442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         */
1443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i, size;
1444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *keys, *values;
1445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, 1);
1447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == RBRACE) {
1448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* it's an empty dict */
1449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
1450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
1451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* it's a simple set */
1452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *elts;
1453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
1454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            elts = asdl_seq_new(size, c->c_arena);
1455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!elts)
1456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(ch); i += 2) {
1458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression;
1459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expression = ast_for_expr(c, CHILD(ch, i));
1460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
1461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(elts, i / 2, expression);
1463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
1465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else if (TYPE(CHILD(ch, 1)) == comp_for) {
1466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* it's a set comprehension */
1467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_setcomp(c, ch);
1468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
1469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_dictcomp(c, ch);
1470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
1471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* it's a dict */
1472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
1473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            keys = asdl_seq_new(size, c->c_arena);
1474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!keys)
1475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            values = asdl_seq_new(size, c->c_arena);
1478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!values)
1479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(ch); i += 4) {
1482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression;
1483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expression = ast_for_expr(c, CHILD(ch, i));
1485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
1486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(keys, i / 4, expression);
1489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expression = ast_for_expr(c, CHILD(ch, i + 2));
1491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
1492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(values, i / 4, expression);
1495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
1497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case BACKQUOTE: { /* repr */
1500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
1501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (Py_Py3kWarningFlag &&
1502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
1503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_testlist(c, CHILD(n, 1));
1505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
1506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
1509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    default:
1511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
1512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic slice_ty
1517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_slice(struct compiling *c, const node *n)
1518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
1520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty lower = NULL, upper = NULL, step = NULL;
1521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, subscript);
1523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*
1525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       sliceop: ':' [test]
1527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ch = CHILD(n, 0);
1529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(ch) == DOT)
1530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Ellipsis(c->c_arena);
1531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1 && TYPE(ch) == test) {
1533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* 'step' variable hold no significance in terms of being used over
1534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           other vars */
1535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        step = ast_for_expr(c, ch);
1536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!step)
1537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Index(step, c->c_arena);
1540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(ch) == test) {
1543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        lower = ast_for_expr(c, ch);
1544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!lower)
1545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If there's an upper bound it's in the second or third position. */
1549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(ch) == COLON) {
1550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) > 1) {
1551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            node *n2 = CHILD(n, 1);
1552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(n2) == test) {
1554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                upper = ast_for_expr(c, n2);
1555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!upper)
1556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (NCH(n) > 2) {
1560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *n2 = CHILD(n, 2);
1561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(n2) == test) {
1563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            upper = ast_for_expr(c, n2);
1564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!upper)
1565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ch = CHILD(n, NCH(n) - 1);
1570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(ch) == sliceop) {
1571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(ch) == 1) {
1572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /*
1573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              This is an extended slice (ie "x[::]") with no expression in the
1574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              step field. We set this literally to "None" in order to
1575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              disambiguate it from x[:]. (The interpreter might have to call
1576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              __getslice__ for x[:], but it must call __getitem__ for x[::].)
1577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
1578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            identifier none = new_identifier("None", c->c_arena);
1579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!none)
1580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(ch, 0);
1582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            step = Name(none, Load, LINENO(ch), ch->n_col_offset, c->c_arena);
1583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!step)
1584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
1586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(ch, 1);
1587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(ch) == test) {
1588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                step = ast_for_expr(c, ch);
1589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!step)
1590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Slice(lower, upper, step, c->c_arena);
1596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_binop(struct compiling *c, const node *n)
1600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Must account for a sequence of expressions.
1602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           How should A op B op C by represented?
1603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           BinOp(BinOp(A, op, B), op, C).
1604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
1605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i, nops;
1607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expr1, expr2, result;
1608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        operator_ty newoperator;
1609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr1 = ast_for_expr(c, CHILD(n, 0));
1611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr1)
1612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr2 = ast_for_expr(c, CHILD(n, 2));
1615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr2)
1616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        newoperator = get_operator(CHILD(n, 1));
1619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!newoperator)
1620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
1623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       c->c_arena);
1624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!result)
1625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nops = (NCH(n) - 1) / 2;
1628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 1; i < nops; i++) {
1629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty tmp_result, tmp;
1630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                const node* next_oper = CHILD(n, i * 2 + 1);
1631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                newoperator = get_operator(next_oper);
1633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!newoperator)
1634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
1637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!tmp)
1638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                tmp_result = BinOp(result, newoperator, tmp,
1641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   LINENO(next_oper), next_oper->n_col_offset,
1642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   c->c_arena);
1643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!tmp_result)
1644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
1645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                result = tmp_result;
1646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return result;
1648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
1652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
1654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       subscriptlist: subscript (',' subscript)* [',']
1655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
1656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
1657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, trailer);
1658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, 0)) == LPAR) {
1659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 2)
1660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
1661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        n->n_col_offset, c->c_arena);
1662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
1663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_call(c, CHILD(n, 1), left_expr);
1664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(CHILD(n, 0)) == DOT ) {
1666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
1667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!attr_id)
1668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Attribute(left_expr, attr_id, Load,
1670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         LINENO(n), n->n_col_offset, c->c_arena);
1671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
1673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(CHILD(n, 0), LSQB);
1674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(CHILD(n, 2), RSQB);
1675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 1);
1676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) == 1) {
1677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            slice_ty slc = ast_for_slice(c, CHILD(n, 0));
1678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!slc)
1679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
1681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             c->c_arena);
1682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
1684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* The grammar is ambiguous here. The ambiguity is resolved
1685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               by treating the sequence as a tuple literal if there are
1686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               no slice features.
1687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
1688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int j;
1689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            slice_ty slc;
1690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty e;
1691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            bool simple = true;
1692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *slices, *elts;
1693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!slices)
1695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < NCH(n); j += 2) {
1697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                slc = ast_for_slice(c, CHILD(n, j));
1698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!slc)
1699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (slc->kind != Index_kind)
1701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    simple = false;
1702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(slices, j / 2, slc);
1703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!simple) {
1705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Subscript(left_expr, ExtSlice(slices, c->c_arena),
1706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 Load, LINENO(n), n->n_col_offset, c->c_arena);
1707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* extract Index values and put them in a Tuple */
1709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
1710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!elts)
1711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < asdl_seq_LEN(slices); ++j) {
1713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                slc = (slice_ty)asdl_seq_GET(slices, j);
1714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(slc->kind == Index_kind  && slc->v.Index.value);
1715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(elts, j, slc->v.Index.value);
1716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
1718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!e)
1719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Subscript(left_expr, Index(e, c->c_arena),
1721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             Load, LINENO(n), n->n_col_offset, c->c_arena);
1722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_factor(struct compiling *c, const node *n)
1728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *pfactor, *ppower, *patom, *pnum;
1730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expression;
1731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If the unary - operator is applied to a constant, don't generate
1733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       a UNARY_NEGATIVE opcode.  Just store the approriate value as a
1734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       constant.  The peephole optimizer already does something like
1735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       this but it doesn't handle the case where the constant is
1736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       (sys.maxint - 1).  In that case, we want a PyIntObject, not a
1737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       PyLongObject.
1738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, 0)) == MINUS &&
1740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        NCH(n) == 2 &&
1741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        TYPE((pfactor = CHILD(n, 1))) == factor &&
1742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        NCH(pfactor) == 1 &&
1743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        TYPE((ppower = CHILD(pfactor, 0))) == power &&
1744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        NCH(ppower) == 1 &&
1745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        TYPE((patom = CHILD(ppower, 0))) == atom &&
1746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
1747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *pynum;
1748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
1749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (s == NULL)
1750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        s[0] = '-';
1752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        strcpy(s + 1, STR(pnum));
1753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pynum = parsenumber(c, s);
1754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject_FREE(s);
1755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!pynum)
1756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyArena_AddPyObject(c->c_arena, pynum);
1759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
1760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expression = ast_for_expr(c, CHILD(n, 1));
1763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!expression)
1764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(CHILD(n, 0))) {
1767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PLUS:
1768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
1769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           c->c_arena);
1770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case MINUS:
1771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
1772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           c->c_arena);
1773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case TILDE:
1774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return UnaryOp(Invert, expression, LINENO(n),
1775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           n->n_col_offset, c->c_arena);
1776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
1778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 TYPE(CHILD(n, 0)));
1779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_power(struct compiling *c, const node *n)
1784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* power: atom trailer* ('**' factor)*
1786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
1787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
1788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty e, tmp;
1789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, power);
1790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    e = ast_for_atom(c, CHILD(n, 0));
1791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!e)
1792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1)
1794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return e;
1795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 1; i < NCH(n); i++) {
1796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *ch = CHILD(n, i);
1797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) != trailer)
1798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp = ast_for_trailer(c, ch, e);
1800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!tmp)
1801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp->lineno = e->lineno;
1803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp->col_offset = e->col_offset;
1804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        e = tmp;
1805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
1807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
1808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!f)
1809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
1811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!tmp)
1812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        e = tmp;
1814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return e;
1816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Do not name a variable 'expr'!  Will cause a compile error.
1819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
1820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_expr(struct compiling *c, const node *n)
1823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* handle the full range of simple expressions
1825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       test: or_test ['if' or_test 'else' test] | lambdef
1826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       or_test: and_test ('or' and_test)*
1827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       and_test: not_test ('and' not_test)*
1828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       not_test: 'not' not_test | comparison
1829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       comparison: expr (comp_op expr)*
1830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       expr: xor_expr ('|' xor_expr)*
1831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       xor_expr: and_expr ('^' and_expr)*
1832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       and_expr: shift_expr ('&' shift_expr)*
1833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       shift_expr: arith_expr (('<<'|'>>') arith_expr)*
1834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       arith_expr: term (('+'|'-') term)*
1835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       term: factor (('*'|'/'|'%'|'//') factor)*
1836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       factor: ('+'|'-'|'~') factor | power
1837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       power: atom trailer* ('**' factor)*
1838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       As well as modified versions that exist for backward compatibility,
1840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       to explicitly allow:
1841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       [ x for x in lambda: 0, lambda: 1 ]
1842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       (which would be ambiguous without these extra rules)
1843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       old_test: or_test | old_lambdef
1845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       old_lambdef: 'lambda' [vararglist] ':' old_test
1846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *seq;
1850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
1851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel loop:
1853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(n)) {
1854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case test:
1855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case old_test:
1856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(CHILD(n, 0)) == lambdef ||
1857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                TYPE(CHILD(n, 0)) == old_lambdef)
1858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_lambdef(c, CHILD(n, 0));
1859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (NCH(n) > 1)
1860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_ifexpr(c, n);
1861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Fallthrough */
1862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case or_test:
1863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case and_test:
1864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
1865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
1867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
1869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!seq)
1870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(n); i += 2) {
1872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty e = ast_for_expr(c, CHILD(n, i));
1873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!e)
1874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(seq, i / 2, e);
1876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!strcmp(STR(CHILD(n, 1)), "and"))
1878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return BoolOp(And, seq, LINENO(n), n->n_col_offset,
1879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              c->c_arena);
1880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert(!strcmp(STR(CHILD(n, 1)), "or"));
1881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
1882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case not_test:
1883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
1884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
1886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression = ast_for_expr(c, CHILD(n, 1));
1889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
1890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
1893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               c->c_arena);
1894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case comparison:
1896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
1897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
1899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression;
1902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_int_seq *ops;
1903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq *cmps;
1904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
1905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!ops)
1906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
1908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!cmps) {
1909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (i = 1; i < NCH(n); i += 2) {
1912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    cmpop_ty newoperator;
1913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    newoperator = ast_for_comp_op(c, CHILD(n, i));
1915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!newoperator) {
1916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
1917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
1918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    expression = ast_for_expr(c, CHILD(n, i + 1));
1920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!expression) {
1921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
1922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
1923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(ops, i / 2, newoperator);
1925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(cmps, i / 2, expression);
1926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expression = ast_for_expr(c, CHILD(n, 0));
1928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression) {
1929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Compare(expression, ops, cmps, LINENO(n),
1933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               n->n_col_offset, c->c_arena);
1934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* The next five cases all handle BinOps.  The main body of code
1938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           is the same in each case, but the switch turned inside out to
1939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           reuse the code for each type of operator.
1940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         */
1941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case expr:
1942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case xor_expr:
1943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case and_expr:
1944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case shift_expr:
1945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case arith_expr:
1946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case term:
1947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
1948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
1950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_binop(c, n);
1952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case yield_expr: {
1953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty exp = NULL;
1954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 2) {
1955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                exp = ast_for_testlist(c, CHILD(n, 1));
1956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!exp)
1957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
1958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
1960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case factor:
1962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
1963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
1964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
1965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_factor(c, n);
1967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case power:
1968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return ast_for_power(c, n);
1969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
1970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
1971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* should never get here unless if error is set */
1974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
1978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_call(struct compiling *c, const node *n, expr_ty func)
1979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*
1981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
1982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               | '**' test)
1983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      argument: [test '='] test [comp_for]        # Really [keyword '='] test
1984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
1985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, nargs, nkeywords, ngens;
1987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *args;
1988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *keywords;
1989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty vararg = NULL, kwarg = NULL;
1990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, arglist);
1992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    nargs = 0;
1994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    nkeywords = 0;
1995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ngens = 0;
1996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i++) {
1997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *ch = CHILD(n, i);
1998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == argument) {
1999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(ch) == 1)
2000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                nargs++;
2001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (TYPE(CHILD(ch, 1)) == comp_for)
2002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ngens++;
2003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                nkeywords++;
2005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (ngens > 1 || (ngens && (nargs || nkeywords))) {
2008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ast_error(n, "Generator expression must be parenthesized "
2009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                  "if not sole argument");
2010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (nargs + nkeywords + ngens > 255) {
2014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      ast_error(n, "more than 255 arguments");
2015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      return NULL;
2016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    args = asdl_seq_new(nargs + ngens, c->c_arena);
2019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!args)
2020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    keywords = asdl_seq_new(nkeywords, c->c_arena);
2022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!keywords)
2023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    nargs = 0;
2025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    nkeywords = 0;
2026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i++) {
2027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *ch = CHILD(n, i);
2028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == argument) {
2029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty e;
2030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(ch) == 1) {
2031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (nkeywords) {
2032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(CHILD(ch, 0),
2033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              "non-keyword arg after keyword arg");
2034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (vararg) {
2037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(CHILD(ch, 0),
2038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              "only named arguments may follow *expression");
2039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                e = ast_for_expr(c, CHILD(ch, 0));
2042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!e)
2043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(args, nargs++, e);
2045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (TYPE(CHILD(ch, 1)) == comp_for) {
2047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                e = ast_for_genexp(c, ch);
2048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!e)
2049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(args, nargs++, e);
2051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                keyword_ty kw;
2054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                identifier key;
2055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int k;
2056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                char *tmp;
2057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* CHILD(ch, 0) is test, but must be an identifier? */
2059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                e = ast_for_expr(c, CHILD(ch, 0));
2060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!e)
2061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* f(lambda x: x[0] = 3) ends up getting parsed with
2063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * LHS test = lambda x: x[0], and RHS test = 3.
2064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * SF bug 132313 points out that complaining about a keyword
2065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * then is very confusing.
2066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 */
2067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (e->kind == Lambda_kind) {
2068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(CHILD(ch, 0),
2069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              "lambda cannot contain assignment");
2070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                } else if (e->kind != Name_kind) {
2072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ast_error(CHILD(ch, 0), "keyword can't be an expression");
2073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                key = e->v.Name.id;
2076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
2077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (k = 0; k < nkeywords; k++) {
2079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tmp = PyString_AS_STRING(
2080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
2081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!strcmp(tmp, PyString_AS_STRING(key))) {
2082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ast_error(CHILD(ch, 0), "keyword argument repeated");
2083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
2084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                e = ast_for_expr(c, CHILD(ch, 2));
2087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!e)
2088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                kw = keyword(key, e, c->c_arena);
2090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!kw)
2091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(keywords, nkeywords++, kw);
2093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (TYPE(ch) == STAR) {
2096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            vararg = ast_for_expr(c, CHILD(n, i+1));
2097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!vararg)
2098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            i++;
2100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (TYPE(ch) == DOUBLESTAR) {
2102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            kwarg = ast_for_expr(c, CHILD(n, i+1));
2103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!kwarg)
2104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            i++;
2106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Call(func, args, keywords, vararg, kwarg, func->lineno,
2110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                func->col_offset, c->c_arena);
2111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
2114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_testlist(struct compiling *c, const node* n)
2115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist_comp: test (',' test)* [','] */
2117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist: test (',' test)* [','] */
2118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist_safe: test (',' test)+ [','] */
2119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist1: test (',' test)* */
2120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) > 0);
2121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == testlist_comp) {
2122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (NCH(n) > 1)
2123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert(TYPE(CHILD(n, 1)) != comp_for);
2124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(TYPE(n) == testlist ||
2127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               TYPE(n) == testlist_safe ||
2128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               TYPE(n) == testlist1);
2129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1)
2131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_for_expr(c, CHILD(n, 0));
2132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *tmp = seq_for_testlist(c, n);
2134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!tmp)
2135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
2137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic expr_ty
2141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_testlist_comp(struct compiling *c, const node* n)
2142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
2144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* argument: test [ comp_for ] */
2145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(TYPE(n) == testlist_comp || TYPE(n) == argument);
2146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == comp_for)
2147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ast_for_genexp(c, n);
2148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ast_for_testlist(c, n);
2149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* like ast_for_testlist() but returns a sequence */
2152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq*
2153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_class_bases(struct compiling *c, const node* n)
2154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* testlist: test (',' test)* [','] */
2156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(NCH(n) > 0);
2157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, testlist);
2158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1) {
2159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty base;
2160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *bases = asdl_seq_new(1, c->c_arena);
2161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!bases)
2162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        base = ast_for_expr(c, CHILD(n, 0));
2164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!base)
2165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(bases, 0, base);
2167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return bases;
2168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return seq_for_testlist(c, n);
2171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_expr_stmt(struct compiling *c, const node *n)
2175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, expr_stmt);
2177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* expr_stmt: testlist (augassign (yield_expr|testlist)
2178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                | ('=' (yield_expr|testlist))*)
2179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       testlist: test (',' test)* [',']
2180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
2181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                | '<<=' | '>>=' | '**=' | '//='
2182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       test: ... here starts the operator precendence dance
2183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
2184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 1) {
2186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty e = ast_for_testlist(c, CHILD(n, 0));
2187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!e)
2188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
2191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(CHILD(n, 1)) == augassign) {
2193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expr1, expr2;
2194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        operator_ty newoperator;
2195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *ch = CHILD(n, 0);
2196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr1 = ast_for_testlist(c, ch);
2198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr1)
2199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if(!set_context(c, expr1, Store, ch))
2201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* set_context checks that most expressions are not the left side.
2203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          Augmented assignments can only have a name, a subscript, or an
2204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          attribute on the left, though, so we have to explicitly check for
2205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          those. */
2206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (expr1->kind) {
2207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case Name_kind:
2208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case Attribute_kind:
2209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case Subscript_kind:
2210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
2212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ast_error(ch, "illegal expression for augmented assignment");
2213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ch = CHILD(n, 2);
2217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(ch) == testlist)
2218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr2 = ast_for_testlist(c, ch);
2219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
2220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr2 = ast_for_expr(c, ch);
2221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr2)
2222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        newoperator = ast_for_augassign(c, CHILD(n, 1));
2225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!newoperator)
2226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
2229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         c->c_arena);
2230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
2233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *targets;
2234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *value;
2235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* a normal assignment */
2238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(CHILD(n, 1), EQUAL);
2239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
2240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!targets)
2241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < NCH(n) - 2; i += 2) {
2243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty e;
2244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            node *ch = CHILD(n, i);
2245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(ch) == yield_expr) {
2246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ast_error(ch, "assignment to yield expression not possible");
2247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            e = ast_for_testlist(c, ch);
2250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!e)
2251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* set context to assign */
2254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!set_context(c, e, Store, CHILD(n, i)))
2255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(targets, i / 2, e);
2258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        value = CHILD(n, NCH(n) - 1);
2260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(value) == testlist)
2261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expression = ast_for_testlist(c, value);
2262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
2263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expression = ast_for_expr(c, value);
2264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Assign(targets, expression, LINENO(n), n->n_col_offset,
2267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      c->c_arena);
2268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_print_stmt(struct compiling *c, const node *n)
2273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* print_stmt: 'print' ( [ test (',' test)* [','] ]
2275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             | '>>' test [ (',' test)+ [','] ] )
2276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
2277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty dest = NULL, expression;
2278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *seq = NULL;
2279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    bool nl;
2280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, j, values_count, start = 1;
2281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, print_stmt);
2283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        dest = ast_for_expr(c, CHILD(n, 2));
2285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!dest)
2286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            start = 4;
2288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    values_count = (NCH(n) + 1 - start) / 2;
2290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (values_count) {
2291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq = asdl_seq_new(values_count, c->c_arena);
2292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq)
2293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
2295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expression = ast_for_expr(c, CHILD(n, i));
2296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!expression)
2297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(seq, j, expression);
2299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
2302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
2303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *
2306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
2307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *seq;
2309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
2310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty e;
2311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, exprlist);
2313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!seq)
2316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < NCH(n); i += 2) {
2318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        e = ast_for_expr(c, CHILD(n, i));
2319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!e)
2320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(seq, i / 2, e);
2322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (context && !set_context(c, e, context, CHILD(n, i)))
2323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return seq;
2326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_del_stmt(struct compiling *c, const node *n)
2330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *expr_list;
2332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* del_stmt: 'del' exprlist */
2334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, del_stmt);
2335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
2337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!expr_list)
2338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
2340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_flow_stmt(struct compiling *c, const node *n)
2344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*
2346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
2347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 | yield_stmt
2348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      break_stmt: 'break'
2349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      continue_stmt: 'continue'
2350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      return_stmt: 'return' [testlist]
2351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      yield_stmt: yield_expr
2352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      yield_expr: 'yield' testlist
2353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      raise_stmt: 'raise' [test [',' test [',' test]]]
2354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
2356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, flow_stmt);
2358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ch = CHILD(n, 0);
2359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(ch)) {
2360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case break_stmt:
2361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Break(LINENO(n), n->n_col_offset, c->c_arena);
2362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case continue_stmt:
2363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Continue(LINENO(n), n->n_col_offset, c->c_arena);
2364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case yield_stmt: { /* will reduce to yield_expr */
2365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
2366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!exp)
2367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
2369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case return_stmt:
2371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(ch) == 1)
2372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
2373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
2375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
2376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Return(expression, LINENO(n), n->n_col_offset,
2378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              c->c_arena);
2379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case raise_stmt:
2381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(ch) == 1)
2382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
2383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             c->c_arena);
2384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (NCH(ch) == 2) {
2385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
2386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expression)
2387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Raise(expression, NULL, NULL, LINENO(n),
2389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             n->n_col_offset, c->c_arena);
2390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (NCH(ch) == 4) {
2392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expr1, expr2;
2393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr1 = ast_for_expr(c, CHILD(ch, 1));
2395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expr1)
2396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr2 = ast_for_expr(c, CHILD(ch, 3));
2398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expr2)
2399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
2402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             c->c_arena);
2403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (NCH(ch) == 6) {
2405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr_ty expr1, expr2, expr3;
2406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr1 = ast_for_expr(c, CHILD(ch, 1));
2408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expr1)
2409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr2 = ast_for_expr(c, CHILD(ch, 3));
2411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expr2)
2412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                expr3 = ast_for_expr(c, CHILD(ch, 5));
2414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!expr3)
2415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
2418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             c->c_arena);
2419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
2421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
2422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "unexpected flow_stmt: %d", TYPE(ch));
2423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
2427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic alias_ty
2431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielalias_for_import_name(struct compiling *c, const node *n, int store)
2432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*
2434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      import_as_name: NAME ['as' NAME]
2435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      dotted_as_name: dotted_name ['as' NAME]
2436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      dotted_name: NAME ('.' NAME)*
2437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *str, *name;
2439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel loop:
2441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (TYPE(n)) {
2442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         case import_as_name: {
2443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            node *name_node = CHILD(n, 0);
2444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            str = NULL;
2445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 3) {
2446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                node *str_node = CHILD(n, 2);
2447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (store && !forbidden_check(c, str_node, STR(str_node)))
2448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                str = NEW_IDENTIFIER(str_node);
2450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!str)
2451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!forbidden_check(c, name_node, STR(name_node)))
2455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            name = NEW_IDENTIFIER(name_node);
2458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!name)
2459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return alias(name, str, c->c_arena);
2461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case dotted_as_name:
2463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
2464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n = CHILD(n, 0);
2465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto loop;
2466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                node *asname_node = CHILD(n, 2);
2469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
2470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!a)
2471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(!a->asname);
2473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!forbidden_check(c, asname_node, STR(asname_node)))
2474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a->asname = NEW_IDENTIFIER(asname_node);
2476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!a->asname)
2477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return a;
2479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case dotted_name:
2482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (NCH(n) == 1) {
2483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                node *name_node = CHILD(n, 0);
2484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (store && !forbidden_check(c, name_node, STR(name_node)))
2485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                name = NEW_IDENTIFIER(name_node);
2487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!name)
2488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return alias(name, NULL, c->c_arena);
2490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Create a string of the form "a.b.c" */
2493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int i;
2494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                size_t len;
2495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                char *s;
2496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                len = 0;
2498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (i = 0; i < NCH(n); i += 2)
2499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* length of string plus one for the dot */
2500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    len += strlen(STR(CHILD(n, i))) + 1;
2501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                len--; /* the last name doesn't have a dot */
2502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                str = PyString_FromStringAndSize(NULL, len);
2503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!str)
2504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                s = PyString_AS_STRING(str);
2506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!s)
2507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (i = 0; i < NCH(n); i += 2) {
2509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    char *sch = STR(CHILD(n, i));
2510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    strcpy(s, STR(CHILD(n, i)));
2511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    s += strlen(sch);
2512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    *s++ = '.';
2513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                --s;
2515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                *s = '\0';
2516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyString_InternInPlace(&str);
2517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyArena_AddPyObject(c->c_arena, str);
2518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return alias(str, NULL, c->c_arena);
2519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STAR:
2522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            str = PyString_InternFromString("*");
2523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyArena_AddPyObject(c->c_arena, str);
2524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return alias(str, NULL, c->c_arena);
2525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
2526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
2527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "unexpected import name: %d", TYPE(n));
2528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
2532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_import_stmt(struct compiling *c, const node *n)
2537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*
2539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      import_stmt: import_name | import_from
2540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      import_name: 'import' dotted_as_names
2541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      import_from: 'from' ('.'* dotted_name | '.') 'import'
2542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          ('*' | '(' import_as_names ')' | import_as_names)
2543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int lineno;
2545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int col_offset;
2546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
2547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *aliases;
2548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, import_stmt);
2550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    lineno = LINENO(n);
2551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    col_offset = n->n_col_offset;
2552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = CHILD(n, 0);
2553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == import_name) {
2554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 1);
2555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(n, dotted_as_names);
2556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
2557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!aliases)
2558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < NCH(n); i += 2) {
2560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
2561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!import_alias)
2562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(aliases, i / 2, import_alias);
2564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Import(aliases, lineno, col_offset, c->c_arena);
2566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(n) == import_from) {
2568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int n_children;
2569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int idx, ndots = 0;
2570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        alias_ty mod = NULL;
2571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        identifier modname = NULL;
2572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       /* Count the number of dots (for relative imports) and check for the
2574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          optional module name */
2575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (idx = 1; idx < NCH(n); idx++) {
2576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (TYPE(CHILD(n, idx)) == dotted_name) {
2577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                mod = alias_for_import_name(c, CHILD(n, idx), 0);
2578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!mod)
2579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                idx++;
2581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else if (TYPE(CHILD(n, idx)) != DOT) {
2583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ndots++;
2586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        idx++; /* skip over the 'import' keyword */
2588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(CHILD(n, idx))) {
2589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STAR:
2590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* from ... import * */
2591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = CHILD(n, idx);
2592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_children = 1;
2593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LPAR:
2595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* from ... import (x, y, z) */
2596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = CHILD(n, idx + 1);
2597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_children = NCH(n);
2598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case import_as_names:
2600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* from ... import x, y, z */
2601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = CHILD(n, idx);
2602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_children = NCH(n);
2603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (n_children % 2 == 0) {
2604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ast_error(n, "trailing comma not allowed without"
2605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             " surrounding parentheses");
2606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
2610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ast_error(n, "Unexpected node-type in from-import");
2611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
2615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!aliases)
2616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* handle "from ... import *" special b/c there's no children */
2619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(n) == STAR) {
2620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            alias_ty import_alias = alias_for_import_name(c, n, 1);
2621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!import_alias)
2622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(aliases, 0, import_alias);
2624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < NCH(n); i += 2) {
2627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
2628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!import_alias)
2629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(aliases, i / 2, import_alias);
2631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (mod != NULL)
2634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            modname = mod->name;
2635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ImportFrom(modname, aliases, ndots, lineno, col_offset,
2636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          c->c_arena);
2637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError,
2639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "unknown import statement: starts with command '%s'",
2640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 STR(CHILD(n, 0)));
2641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_global_stmt(struct compiling *c, const node *n)
2646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* global_stmt: 'global' NAME (',' NAME)* */
2648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    identifier name;
2649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *s;
2650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
2651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, global_stmt);
2653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    s = asdl_seq_new(NCH(n) / 2, c->c_arena);
2654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!s)
2655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 1; i < NCH(n); i += 2) {
2657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name = NEW_IDENTIFIER(CHILD(n, i));
2658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!name)
2659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(s, i / 2, name);
2661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
2663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_exec_stmt(struct compiling *c, const node *n)
2667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expr1, globals = NULL, locals = NULL;
2669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_children = NCH(n);
2670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_children != 2 && n_children != 4 && n_children != 6) {
2671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_SystemError,
2672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "poorly formed 'exec' statement: %d parts to statement",
2673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     n_children);
2674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* exec_stmt: 'exec' expr ['in' test [',' test]] */
2678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, exec_stmt);
2679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr1 = ast_for_expr(c, CHILD(n, 1));
2680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!expr1)
2681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (expr1->kind == Tuple_kind && n_children < 4 &&
2684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        (asdl_seq_LEN(expr1->v.Tuple.elts) == 2 ||
2685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         asdl_seq_LEN(expr1->v.Tuple.elts) == 3)) {
2686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Backwards compatibility: passing exec args as a tuple */
2687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = asdl_seq_GET(expr1->v.Tuple.elts, 1);
2688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (asdl_seq_LEN(expr1->v.Tuple.elts) == 3) {
2689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            locals = asdl_seq_GET(expr1->v.Tuple.elts, 2);
2690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr1 = asdl_seq_GET(expr1->v.Tuple.elts, 0);
2692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_children >= 4) {
2695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = ast_for_expr(c, CHILD(n, 3));
2696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!globals)
2697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_children == 6) {
2700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        locals = ast_for_expr(c, CHILD(n, 5));
2701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!locals)
2702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
2706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                c->c_arena);
2707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_assert_stmt(struct compiling *c, const node *n)
2711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* assert_stmt: 'assert' test [',' test] */
2713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, assert_stmt);
2714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 2) {
2715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression = ast_for_expr(c, CHILD(n, 1));
2716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Assert(expression, NULL, LINENO(n), n->n_col_offset,
2719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      c->c_arena);
2720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(n) == 4) {
2722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expr1, expr2;
2723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr1 = ast_for_expr(c, CHILD(n, 1));
2725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr1)
2726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr2 = ast_for_expr(c, CHILD(n, 3));
2728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expr2)
2729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
2732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError,
2734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "improper number of parts to 'assert' statement: %d",
2735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 NCH(n));
2736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic asdl_seq *
2740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_suite(struct compiling *c, const node *n)
2741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
2743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *seq;
2744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    stmt_ty s;
2745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, total, num, end, pos = 0;
2746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node *ch;
2747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, suite);
2749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    total = num_stmts(n);
2751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    seq = asdl_seq_new(total, c->c_arena);
2752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!seq)
2753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, 0)) == simple_stmt) {
2755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
2756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* simple_stmt always ends with a NEWLINE,
2757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           and may have a trailing SEMI
2758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
2759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        end = NCH(n) - 1;
2760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(CHILD(n, end - 1)) == SEMI)
2761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            end--;
2762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* loop by 2 to skip semi-colons */
2763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < end; i += 2) {
2764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(n, i);
2765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            s = ast_for_stmt(c, ch);
2766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!s)
2767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(seq, pos++, s);
2769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 2; i < (NCH(n) - 1); i++) {
2773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ch = CHILD(n, i);
2774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            REQ(ch, stmt);
2775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            num = num_stmts(ch);
2776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (num == 1) {
2777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* small_stmt or compound_stmt with only one child */
2778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                s = ast_for_stmt(c, ch);
2779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!s)
2780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                asdl_seq_SET(seq, pos++, s);
2782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int j;
2785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ch = CHILD(ch, 0);
2786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                REQ(ch, simple_stmt);
2787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (j = 0; j < NCH(ch); j += 2) {
2788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* statement terminates with a semi-colon ';' */
2789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (NCH(CHILD(ch, j)) == 0) {
2790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        assert((j + 1) == NCH(ch));
2791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        break;
2792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    s = ast_for_stmt(c, CHILD(ch, j));
2794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!s)
2795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
2796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    asdl_seq_SET(seq, pos++, s);
2797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(pos == seq->size);
2802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return seq;
2803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_if_stmt(struct compiling *c, const node *n)
2807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
2809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       ['else' ':' suite]
2810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *s;
2812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, if_stmt);
2814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 4) {
2816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq;
2818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 1));
2820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        suite_seq = ast_for_suite(c, CHILD(n, 3));
2823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
2824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                  c->c_arena);
2828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    s = STR(CHILD(n, 4));
2831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* s[2], the third character in the string, will be
2832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       's' for el_s_e, or
2833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       'i' for el_i_f
2834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (s[2] == 's') {
2836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *seq1, *seq2;
2838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 1));
2840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq1 = ast_for_suite(c, CHILD(n, 3));
2843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq1)
2844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq2 = ast_for_suite(c, CHILD(n, 6));
2846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq2)
2847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                  c->c_arena);
2851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (s[2] == 'i') {
2853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i, n_elif, has_else = 0;
2854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq;
2856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *orelse = NULL;
2857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n_elif = NCH(n) - 4;
2858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* must reference the child n_elif+1 since 'else' token is third,
2859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           not fourth, child from the end. */
2860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (TYPE(CHILD(n, (n_elif + 1))) == NAME
2861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
2862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            has_else = 1;
2863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_elif -= 3;
2864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n_elif /= 4;
2866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (has_else) {
2868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *suite_seq2;
2869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            orelse = asdl_seq_new(1, c->c_arena);
2871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!orelse)
2872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
2874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!expression)
2875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
2877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!suite_seq)
2878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
2880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!suite_seq2)
2881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(orelse, 0,
2884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         If(expression, suite_seq, suite_seq2,
2885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            LINENO(CHILD(n, NCH(n) - 6)),
2886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            CHILD(n, NCH(n) - 6)->n_col_offset,
2887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            c->c_arena));
2888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* the just-created orelse handled the last elif */
2889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_elif--;
2890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < n_elif; i++) {
2893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int off = 5 + (n_elif - i - 1) * 4;
2894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
2895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!newobj)
2896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            expression = ast_for_expr(c, CHILD(n, off));
2898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!expression)
2899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            suite_seq = ast_for_suite(c, CHILD(n, off + 2));
2901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!suite_seq)
2902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(newobj, 0,
2905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         If(expression, suite_seq, orelse,
2906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            LINENO(CHILD(n, off)),
2907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            CHILD(n, off)->n_col_offset, c->c_arena));
2908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            orelse = newobj;
2909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 1));
2911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        suite_seq = ast_for_suite(c, CHILD(n, 3));
2914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
2915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return If(expression, suite_seq, orelse,
2917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                  LINENO(n), n->n_col_offset, c->c_arena);
2918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError,
2921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "unexpected token in 'if' statement: %s", s);
2922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_while_stmt(struct compiling *c, const node *n)
2927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
2929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, while_stmt);
2930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 4) {
2932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq;
2934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 1));
2936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        suite_seq = ast_for_suite(c, CHILD(n, 3));
2939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
2940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
2942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     c->c_arena);
2943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(n) == 7) {
2945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
2946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *seq1, *seq2;
2947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(n, 1));
2949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
2950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq1 = ast_for_suite(c, CHILD(n, 3));
2952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq1)
2953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq2 = ast_for_suite(c, CHILD(n, 6));
2955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq2)
2956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
2959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     c->c_arena);
2960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError,
2963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "wrong number of tokens for 'while' statement: %d",
2964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 NCH(n));
2965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
2969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_for_stmt(struct compiling *c, const node *n)
2970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *_target, *seq = NULL, *suite_seq;
2972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty expression;
2973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty target, first;
2974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const node *node_target;
2975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
2976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, for_stmt);
2977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 9) {
2979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seq = ast_for_suite(c, CHILD(n, 8));
2980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!seq)
2981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    node_target = CHILD(n, 1);
2985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _target = ast_for_exprlist(c, node_target, Store);
2986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!_target)
2987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Check the # of children rather than the length of _target, since
2989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       for x, in ... has 1 element in _target, but still requires a Tuple. */
2990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    first = (expr_ty)asdl_seq_GET(_target, 0);
2991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(node_target) == 1)
2992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        target = first;
2993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
2994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
2995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expression = ast_for_testlist(c, CHILD(n, 3));
2997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!expression)
2998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    suite_seq = ast_for_suite(c, CHILD(n, 5));
3000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!suite_seq)
3001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
3004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               c->c_arena);
3005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic excepthandler_ty
3008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_except_clause(struct compiling *c, const node *exc, node *body)
3009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* except_clause: 'except' [test [(',' | 'as') test]] */
3011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(exc, except_clause);
3012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(body, suite);
3013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(exc) == 1) {
3015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq = ast_for_suite(c, body);
3016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
3017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
3020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             exc->n_col_offset, c->c_arena);
3021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(exc) == 2) {
3023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
3024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq;
3025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(exc, 1));
3027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
3028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        suite_seq = ast_for_suite(c, body);
3030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
3031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
3034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             exc->n_col_offset, c->c_arena);
3035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (NCH(exc) == 4) {
3037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *suite_seq;
3038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty expression;
3039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expr_ty e = ast_for_expr(c, CHILD(exc, 3));
3040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!e)
3041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!set_context(c, e, Store, CHILD(exc, 3)))
3043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        expression = ast_for_expr(c, CHILD(exc, 1));
3045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!expression)
3046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        suite_seq = ast_for_suite(c, body);
3048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!suite_seq)
3049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ExceptHandler(expression, e, suite_seq, LINENO(exc),
3052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             exc->n_col_offset, c->c_arena);
3053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_SystemError,
3056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "wrong number of children for 'except' clause: %d",
3057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 NCH(exc));
3058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
3059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
3062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_try_stmt(struct compiling *c, const node *n)
3063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const int nch = NCH(n);
3065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n_except = (nch - 3)/3;
3066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *body, *orelse = NULL, *finally = NULL;
3067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, try_stmt);
3069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    body = ast_for_suite(c, CHILD(n, 2));
3071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (body == NULL)
3072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n, nch - 3)) == NAME) {
3075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
3076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
3077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* we can assume it's an "else",
3078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   because nch >= 9 for try-else-finally and
3079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   it would otherwise have a type of except_clause */
3080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                orelse = ast_for_suite(c, CHILD(n, nch - 4));
3081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (orelse == NULL)
3082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
3083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n_except--;
3084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            finally = ast_for_suite(c, CHILD(n, nch - 1));
3087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (finally == NULL)
3088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_except--;
3090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
3092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* we can assume it's an "else",
3093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               otherwise it would have a type of except_clause */
3094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            orelse = ast_for_suite(c, CHILD(n, nch - 1));
3095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (orelse == NULL)
3096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n_except--;
3098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
3101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ast_error(n, "malformed 'try' statement");
3102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n_except > 0) {
3106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
3107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        stmt_ty except_st;
3108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* process except statements to create a try ... except */
3109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
3110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (handlers == NULL)
3111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < n_except; i++) {
3114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
3115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                       CHILD(n, 5 + i * 3));
3116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!e)
3117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            asdl_seq_SET(handlers, i, e);
3119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        except_st = TryExcept(body, handlers, orelse, LINENO(n),
3122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                              n->n_col_offset, c->c_arena);
3123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!finally)
3124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return except_st;
3125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* if a 'finally' is present too, we nest the TryExcept within a
3127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           TryFinally to emulate try ... except ... finally */
3128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        body = asdl_seq_new(1, c->c_arena);
3129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (body == NULL)
3130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(body, 0, except_st);
3132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* must be a try ... finally (except clauses are in body, if any exist) */
3135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(finally != NULL);
3136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
3137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* with_item: test ['as' expr] */
3140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
3141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
3142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    expr_ty context_expr, optional_vars = NULL;
3144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, with_item);
3146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    context_expr = ast_for_expr(c, CHILD(n, 0));
3147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!context_expr)
3148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 3) {
3150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        optional_vars = ast_for_expr(c, CHILD(n, 2));
3151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!optional_vars) {
3153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!set_context(c, optional_vars, Store, n)) {
3156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return With(context_expr, optional_vars, content, LINENO(n),
3161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n->n_col_offset, c->c_arena);
3162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
3165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
3166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_with_stmt(struct compiling *c, const node *n)
3167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
3169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    stmt_ty ret;
3170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *inner;
3171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, with_stmt);
3173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* process the with items inside-out */
3175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    i = NCH(n) - 1;
3176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* the suite of the innermost with item is the suite of the with stmt */
3177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    inner = ast_for_suite(c, CHILD(n, i));
3178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!inner)
3179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
3182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        i -= 2;
3183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ret = ast_for_with_item(c, CHILD(n, i), inner);
3184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!ret)
3185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* was this the last item? */
3187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i == 1)
3188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
3189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* if not, wrap the result so far in a new sequence */
3190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        inner = asdl_seq_new(1, c->c_arena);
3191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!inner)
3192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        asdl_seq_SET(inner, 0, ret);
3194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ret;
3197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
3200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
3201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *classname;
3204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asdl_seq *bases, *s;
3205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    REQ(n, classdef);
3207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!forbidden_check(c, n, STR(CHILD(n, 1))))
3209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (NCH(n) == 4) {
3212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        s = ast_for_suite(c, CHILD(n, 3));
3213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!s)
3214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        classname = NEW_IDENTIFIER(CHILD(n, 1));
3216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!classname)
3217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        n->n_col_offset, c->c_arena);
3220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* check for empty base list */
3222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(CHILD(n,3)) == RPAR) {
3223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        s = ast_for_suite(c, CHILD(n,5));
3224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!s)
3225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        classname = NEW_IDENTIFIER(CHILD(n, 1));
3227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!classname)
3228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
3230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        n->n_col_offset, c->c_arena);
3231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* else handle the base class list */
3234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    bases = ast_for_class_bases(c, CHILD(n, 3));
3235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!bases)
3236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    s = ast_for_suite(c, CHILD(n, 6));
3239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!s)
3240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    classname = NEW_IDENTIFIER(CHILD(n, 1));
3242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!classname)
3243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ClassDef(classname, bases, s, decorator_seq,
3245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    LINENO(n), n->n_col_offset, c->c_arena);
3246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic stmt_ty
3249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielast_for_stmt(struct compiling *c, const node *n)
3250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == stmt) {
3252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(NCH(n) == 1);
3253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
3254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == simple_stmt) {
3256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(num_stmts(n) == 1);
3257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
3258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (TYPE(n) == small_stmt) {
3260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = CHILD(n, 0);
3261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* small_stmt: expr_stmt | print_stmt  | del_stmt | pass_stmt
3262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     | flow_stmt | import_stmt | global_stmt | exec_stmt
3263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     | assert_stmt
3264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
3265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(n)) {
3266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case expr_stmt:
3267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_expr_stmt(c, n);
3268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case print_stmt:
3269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_print_stmt(c, n);
3270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case del_stmt:
3271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_del_stmt(c, n);
3272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case pass_stmt:
3273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return Pass(LINENO(n), n->n_col_offset, c->c_arena);
3274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case flow_stmt:
3275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_flow_stmt(c, n);
3276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case import_stmt:
3277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_import_stmt(c, n);
3278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case global_stmt:
3279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_global_stmt(c, n);
3280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case exec_stmt:
3281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_exec_stmt(c, n);
3282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case assert_stmt:
3283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_assert_stmt(c, n);
3284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
3285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError,
3286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "unhandled small_stmt: TYPE=%d NCH=%d\n",
3287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             TYPE(n), NCH(n));
3288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
3292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
3293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        | funcdef | classdef | decorated
3294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
3295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        node *ch = CHILD(n, 0);
3296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(n, compound_stmt);
3297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (TYPE(ch)) {
3298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case if_stmt:
3299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_if_stmt(c, ch);
3300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case while_stmt:
3301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_while_stmt(c, ch);
3302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case for_stmt:
3303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_for_stmt(c, ch);
3304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case try_stmt:
3305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_try_stmt(c, ch);
3306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case with_stmt:
3307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_with_stmt(c, ch);
3308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case funcdef:
3309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_funcdef(c, ch, NULL);
3310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case classdef:
3311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_classdef(c, ch, NULL);
3312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case decorated:
3313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return ast_for_decorated(c, ch);
3314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
3315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError,
3316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "unhandled small_stmt: TYPE=%d NCH=%d\n",
3317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             TYPE(n), NCH(n));
3318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielparsenumber(struct compiling *c, const char *s)
3325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const char *end;
3327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        long x;
3328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        double dx;
3329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITHOUT_COMPLEX
3330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_complex complex;
3331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int imflag;
3332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(s != NULL);
3335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        errno = 0;
3336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        end = s + strlen(s) - 1;
3337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITHOUT_COMPLEX
3338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        imflag = *end == 'j' || *end == 'J';
3339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (*end == 'l' || *end == 'L')
3341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyLong_FromString((char *)s, (char **)0, 0);
3342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        x = PyOS_strtol((char *)s, (char **)&end, 0);
3343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (*end == '\0') {
3344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (errno != 0)
3345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return PyLong_FromString((char *)s, (char **)0, 0);
3346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyInt_FromLong(x);
3347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* XXX Huge floats may silently fail */
3349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITHOUT_COMPLEX
3350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (imflag) {
3351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                complex.real = 0.;
3352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                complex.imag = PyOS_string_to_double(s, (char **)&end, NULL);
3353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (complex.imag == -1.0 && PyErr_Occurred())
3354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyComplex_FromCComplex(complex);
3356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
3358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
3360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                dx = PyOS_string_to_double(s, NULL, NULL);
3361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (dx == -1.0 && PyErr_Occurred())
3362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyFloat_FromDouble(dx);
3364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldecode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
3369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_USING_UNICODE
3371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("decode_utf8 should not be called in this build.");
3372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
3374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *u, *v;
3375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *s, *t;
3376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        t = s = (char *)*sPtr;
3377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
3378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        while (s < end && (*s & 0x80)) s++;
3379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        *sPtr = s;
3380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        u = PyUnicode_DecodeUTF8(t, s - t, NULL);
3381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (u == NULL)
3382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        v = PyUnicode_AsEncodedString(u, encoding, NULL);
3384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(u);
3385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
3386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldecode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
3392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *v;
3394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *u = NULL;
3395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *buf;
3396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *p;
3397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const char *end;
3398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (encoding != NULL && strcmp(encoding, "iso-8859-1")) {
3399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* check for integer overflow */
3400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (len > PY_SIZE_MAX / 6)
3401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* "<C3><A4>" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
3403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
3404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                u = PyString_FromStringAndSize((char *)NULL, len * 6);
3405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (u == NULL)
3406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                p = buf = PyString_AsString(u);
3408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                end = s + len;
3409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (s < end) {
3410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (*s == '\\') {
3411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                *p++ = *s++;
3412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                if (*s & 0x80) {
3413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        strcpy(p, "u005c");
3414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        p += 5;
3415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                }
3416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        }
3417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (*s & 0x80) { /* XXX inefficient */
3418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyObject *w;
3419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                char *r;
3420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                Py_ssize_t rn, i;
3421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                w = decode_utf8(c, &s, end, "utf-32-be");
3422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                if (w == NULL) {
3423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        Py_DECREF(u);
3424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        return NULL;
3425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                }
3426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                r = PyString_AsString(w);
3427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                rn = PyString_Size(w);
3428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                assert(rn % 4 == 0);
3429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                for (i = 0; i < rn; i += 4) {
3430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        sprintf(p, "\\U%02x%02x%02x%02x",
3431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                r[i + 0] & 0xFF,
3432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                r[i + 1] & 0xFF,
3433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                r[i + 2] & 0xFF,
3434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                r[i + 3] & 0xFF);
3435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        p += 10;
3436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                }
3437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                Py_DECREF(w);
3438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        } else {
3439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                *p++ = *s++;
3440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        }
3441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                len = p - buf;
3443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                s = buf;
3444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (rawmode)
3446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
3447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
3448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
3449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(u);
3450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
3451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* s is a Python string literal, including the bracketing quote characters,
3455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * and r &/or u prefixes (if any), and embedded escape sequences (if any).
3456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * parsestr parses it, and returns the decoded Python string object.
3457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
3458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielparsestr(struct compiling *c, const node *n, const char *s)
3460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        size_t len, i;
3462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int quote = Py_CHARMASK(*s);
3463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int rawmode = 0;
3464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int need_encoding;
3465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int unicode = c->c_future_unicode;
3466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int bytes = 0;
3467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (isalpha(quote) || quote == '_') {
3469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (quote == 'u' || quote == 'U') {
3470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        quote = *++s;
3471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        unicode = 1;
3472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (quote == 'b' || quote == 'B') {
3474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        quote = *++s;
3475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        unicode = 0;
3476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        bytes = 1;
3477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (quote == 'r' || quote == 'R') {
3479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        quote = *++s;
3480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        rawmode = 1;
3481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (quote != '\'' && quote != '\"') {
3484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_BadInternalCall();
3485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        s++;
3488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        len = strlen(s);
3489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (len > INT_MAX) {
3490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_OverflowError,
3491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "string to parse is too long");
3492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (s[--len] != quote) {
3495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_BadInternalCall();
3496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
3497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (len >= 4 && s[0] == quote && s[1] == quote) {
3499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                s += 2;
3500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                len -= 2;
3501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (s[--len] != quote || s[--len] != quote) {
3502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyErr_BadInternalCall();
3503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (Py_Py3kWarningFlag && bytes) {
3507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < len; i++) {
3508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((unsigned char)s[i] > 127) {
3509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!ast_warn(c, n,
3510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "non-ascii bytes literals not supported in 3.x"))
3511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
3512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
3513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (unicode || Py_UnicodeFlag) {
3518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return decode_unicode(c, s, len, rawmode, c->c_encoding);
3519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        need_encoding = (c->c_encoding != NULL &&
3522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         strcmp(c->c_encoding, "utf-8") != 0 &&
3523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         strcmp(c->c_encoding, "iso-8859-1") != 0);
3524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (rawmode || strchr(s, '\\') == NULL) {
3525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need_encoding) {
3526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_USING_UNICODE
3527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        /* This should not happen - we never see any other
3528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           encoding. */
3529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_FatalError(
3530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            "cannot deal with encodings in this build.");
3531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
3532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
3533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (u == NULL)
3534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                return NULL;
3535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
3536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_DECREF(u);
3537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return v;
3538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                } else {
3540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return PyString_FromStringAndSize(s, len);
3541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyString_DecodeEscape(s, len, NULL, unicode,
3545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     need_encoding ? c->c_encoding : NULL);
3546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Build a Python string object out of a STRING atom.  This takes care of
3549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * compile-time literal catenation, calling parsestr() on each piece, and
3550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * pasting the intermediate results together.
3551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
3552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielparsestrplus(struct compiling *c, const node *n)
3554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *v;
3556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
3557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        REQ(CHILD(n, 0), STRING);
3558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if ((v = parsestr(c, n, STR(CHILD(n, 0)))) != NULL) {
3559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* String literal concatenation */
3560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (i = 1; i < NCH(n); i++) {
3561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyObject *s;
3562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        s = parsestr(c, n, STR(CHILD(n, i)));
3563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (s == NULL)
3564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                goto onError;
3565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (PyString_Check(v) && PyString_Check(s)) {
3566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyString_ConcatAndDel(&v, s);
3567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                if (v == NULL)
3568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    goto onError;
3569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        }
3570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        else {
3572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyObject *temp = PyUnicode_Concat(v, s);
3573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                Py_DECREF(s);
3574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                Py_DECREF(v);
3575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                v = temp;
3576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                if (v == NULL)
3577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    goto onError;
3578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        }
3579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
3583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel onError:
3585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(v);
3586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3588