14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This file includes functions to transform a concrete syntax tree (CST) to
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * an abstract syntax tree (AST).  The main function is PyAST_FromNode().
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h"
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python-ast.h"
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "grammar.h"
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "node.h"
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "pyarena.h"
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "ast.h"
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "token.h"
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "parsetok.h"
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "graminit.h"
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <assert.h>
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Data structure used internally */
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstruct compiling {
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *c_encoding; /* source encoding */
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int c_future_unicode; /* __future__ unicode literals flag */
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyArena *c_arena; /* arena for allocating memeory */
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char *c_filename; /* filename */
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm};
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *seq_for_testlist(struct compiling *, const node *);
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty ast_for_expr(struct compiling *, const node *);
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty ast_for_stmt(struct compiling *, const node *);
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *ast_for_suite(struct compiling *, const node *);
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *ast_for_exprlist(struct compiling *, const node *,
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                  expr_context_ty);
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty ast_for_testlist(struct compiling *, const node *);
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty ast_for_testlist_comp(struct compiling *, const node *);
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Note different signature for ast_for_call */
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *parsenumber(struct compiling *, const char *);
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *parsestr(struct compiling *, const char *);
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *parsestrplus(struct compiling *, const node *n);
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef LINENO
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LINENO(n)       ((n)->n_lineno)
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define COMP_GENEXP 0
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define COMP_SETCOMP  1
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic identifier
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnew_identifier(const char* n, PyArena *arena) {
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject* id = PyString_InternFromString(n);
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (id != NULL)
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyArena_AddPyObject(arena, id);
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return id;
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* This routine provides an invalid object for the syntax error.
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   The outermost routine must unpack this error and create the
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   proper object.  We do this so that we don't have to pass
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the filename to everything function.
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   XXX Maybe we should just pass the filename...
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_error(const node *n, const char *errstr)
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *u = Py_BuildValue("zi", errstr, LINENO(n));
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!u)
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetObject(PyExc_SyntaxError, u);
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(u);
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_error_finish(const char *filename)
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *type, *value, *tback, *errstr, *loc, *tmp;
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    long lineno;
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(PyErr_Occurred());
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Fetch(&type, &value, &tback);
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    errstr = PyTuple_GetItem(value, 0);
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!errstr)
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_INCREF(errstr);
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    lineno = PyInt_AsLong(PyTuple_GetItem(value, 1));
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (lineno == -1) {
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(errstr);
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(value);
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    loc = PyErr_ProgramText(filename, lineno);
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!loc) {
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_INCREF(Py_None);
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        loc = Py_None;
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(loc);
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!tmp) {
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(errstr);
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = PyTuple_Pack(2, errstr, tmp);
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(errstr);
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Py_DECREF(tmp);
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!value)
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return;
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Restore(type, value, tback);
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_warn(struct compiling *c, const node *n, char *msg)
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n),
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           NULL, NULL) < 0) {
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* if -Werr, change it to a SyntaxError */
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning))
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ast_error(n, msg);
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 0;
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmforbidden_check(struct compiling *c, const node *n, const char *x)
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!strcmp(x, "None"))
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_error(n, "cannot assign to None");
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!strcmp(x, "__debug__"))
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_error(n, "cannot assign to __debug__");
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (Py_Py3kWarningFlag) {
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!(strcmp(x, "True") && strcmp(x, "False")) &&
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            !ast_warn(c, n, "assignment to True or False is forbidden in 3.x"))
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!strcmp(x, "nonlocal") &&
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            !ast_warn(c, n, "nonlocal is a keyword in 3.x"))
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* num_stmts() returns number of contained statements.
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Use this routine to determine how big a sequence is needed for
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the statements in a parse tree.  Its raison d'etre is this bit of
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   grammar:
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   stmt: simple_stmt | compound_stmt
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   A simple_stmt can contain multiple small_stmt elements joined
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   by semicolons.  If the arg is a simple_stmt, the number of
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   small_stmt elements is returned.
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnum_stmts(const node *n)
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, l;
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(n)) {
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case single_input:
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(CHILD(n, 0)) == NEWLINE)
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return num_stmts(CHILD(n, 0));
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case file_input:
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            l = 0;
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(n); i++) {
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ch = CHILD(n, i);
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (TYPE(ch) == stmt)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    l += num_stmts(ch);
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return l;
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case stmt:
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return num_stmts(CHILD(n, 0));
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case compound_stmt:
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 1;
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case simple_stmt:
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case suite:
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1)
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return num_stmts(CHILD(n, 0));
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                l = 0;
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 2; i < (NCH(n) - 1); i++)
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    l += num_stmts(CHILD(n, i));
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return l;
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default: {
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            char buf[128];
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sprintf(buf, "Non-statement found: %d %d",
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    TYPE(n), NCH(n));
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            Py_FatalError(buf);
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(0);
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 0;
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Transform the CST rooted at node * to the appropriate AST
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmod_ty
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               PyArena *arena)
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, j, k, num;
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *stmts = NULL;
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    stmt_ty s;
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    struct compiling c;
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c.c_encoding = "utf-8";
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(n) == encoding_decl) {
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ast_error(n, "encoding declaration in Unicode string");
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (TYPE(n) == encoding_decl) {
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c.c_encoding = STR(n);
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else {
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c.c_encoding = NULL;
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS;
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c.c_arena = arena;
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c.c_filename = filename;
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    k = 0;
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(n)) {
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case file_input:
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stmts = asdl_seq_new(num_stmts(n), arena);
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!stmts)
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(n) - 1; i++) {
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ch = CHILD(n, i);
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (TYPE(ch) == NEWLINE)
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    continue;
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(ch, stmt);
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                num = num_stmts(ch);
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (num == 1) {
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s = ast_for_stmt(&c, ch);
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!s)
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto error;
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(stmts, k++, s);
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else {
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ch = CHILD(ch, 0);
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    REQ(ch, simple_stmt);
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    for (j = 0; j < num; j++) {
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        s = ast_for_stmt(&c, CHILD(ch, j * 2));
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (!s)
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            goto error;
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        asdl_seq_SET(stmts, k++, s);
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Module(stmts, arena);
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case eval_input: {
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty testlist_ast;
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* XXX Why not comp_for here? */
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!testlist_ast)
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto error;
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Expression(testlist_ast, arena);
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case single_input:
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(CHILD(n, 0)) == NEWLINE) {
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                stmts = asdl_seq_new(1, arena);
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!stmts)
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                            arena));
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!asdl_seq_GET(stmts, 0))
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Interactive(stmts, arena);
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                num = num_stmts(n);
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                stmts = asdl_seq_new(num, arena);
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!stmts)
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    goto error;
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (num == 1) {
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s = ast_for_stmt(&c, n);
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!s)
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto error;
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(stmts, 0, s);
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else {
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* Only a simple_stmt can contain multiple statements. */
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    REQ(n, simple_stmt);
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    for (i = 0; i < NCH(n); i += 2) {
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (TYPE(CHILD(n, i)) == NEWLINE)
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            break;
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        s = ast_for_stmt(&c, CHILD(n, i));
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (!s)
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            goto error;
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        asdl_seq_SET(stmts, i / 2, s);
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Interactive(stmts, arena);
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError,
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "invalid node %d for PyAST_FromNode", TYPE(n));
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto error;
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm error:
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ast_error_finish(filename);
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic operator_ty
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmget_operator(const node *n)
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(n)) {
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case VBAR:
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitOr;
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case CIRCUMFLEX:
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitXor;
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case AMPER:
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitAnd;
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case LEFTSHIFT:
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return LShift;
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case RIGHTSHIFT:
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return RShift;
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case PLUS:
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Add;
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case MINUS:
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Sub;
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case STAR:
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Mult;
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SLASH:
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Div;
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case DOUBLESLASH:
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return FloorDiv;
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case PERCENT:
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Mod;
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (operator_ty)0;
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set the context ctx for expr_ty e, recursively traversing e.
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Only sets context for expr kinds that "can appear in assignment context"
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   (according to ../Parser/Python.asdl).  For other expr kinds, it sets
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   an appropriate syntax error and returns false.
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *s = NULL;
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If a particular expression type can't be used for assign / delete,
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       set expr_name to its name and an error message will be generated.
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const char* expr_name = NULL;
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* The ast defines augmented store and load contexts, but the
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       implementation here doesn't actually use them.  The code may be
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       a little more complex than necessary as a result.  It also means
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       that expressions in an augmented assignment have a Store context.
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       Consider restructuring so that augmented assignment uses
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       set_context(), too.
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(ctx != AugStore && ctx != AugLoad);
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (e->kind) {
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Attribute_kind:
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (ctx == Store && !forbidden_check(c, n,
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyBytes_AS_STRING(e->v.Attribute.attr)))
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return 0;
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e->v.Attribute.ctx = ctx;
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Subscript_kind:
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e->v.Subscript.ctx = ctx;
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Name_kind:
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (ctx == Store && !forbidden_check(c, n,
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyBytes_AS_STRING(e->v.Name.id)))
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return 0;
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e->v.Name.ctx = ctx;
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case List_kind:
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e->v.List.ctx = ctx;
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s = e->v.List.elts;
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Tuple_kind:
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (asdl_seq_LEN(e->v.Tuple.elts))  {
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e->v.Tuple.ctx = ctx;
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = e->v.Tuple.elts;
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_name = "()";
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Lambda_kind:
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "lambda";
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Call_kind:
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "function call";
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BoolOp_kind:
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case BinOp_kind:
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case UnaryOp_kind:
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "operator";
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case GeneratorExp_kind:
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "generator expression";
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Yield_kind:
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "yield expression";
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case ListComp_kind:
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "list comprehension";
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case SetComp_kind:
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "set comprehension";
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case DictComp_kind:
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "dict comprehension";
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Dict_kind:
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Set_kind:
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Num_kind:
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Str_kind:
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "literal";
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Compare_kind:
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "comparison";
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case Repr_kind:
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "repr";
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case IfExp_kind:
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_name = "conditional expression";
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError,
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "unexpected expression in assignment %d (line %d)",
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         e->kind, e->lineno);
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return 0;
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check for error string set by switch */
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (expr_name) {
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char buf[300];
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyOS_snprintf(buf, sizeof(buf),
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      "can't %s %s",
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      ctx == Store ? "assign to" : "delete",
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      expr_name);
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_error(n, buf);
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If the LHS is a list or tuple, we need to set the assignment
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       context for all the contained elements.
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s) {
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < asdl_seq_LEN(s); i++) {
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return 0;
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return 1;
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic operator_ty
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_augassign(struct compiling *c, const node *n)
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, augassign);
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = CHILD(n, 0);
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (STR(n)[0]) {
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '+':
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Add;
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '-':
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Sub;
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '/':
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (STR(n)[1] == '/')
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return FloorDiv;
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Div;
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '%':
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Mod;
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '<':
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return LShift;
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '>':
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return RShift;
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '&':
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitAnd;
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '^':
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitXor;
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '|':
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BitOr;
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case '*':
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (STR(n)[1] == '*')
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Pow;
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Mult;
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (operator_ty)0;
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic cmpop_ty
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_comp_op(struct compiling *c, const node *n)
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               |'is' 'not'
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, comp_op);
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1) {
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(n)) {
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case LESS:
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Lt;
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case GREATER:
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Gt;
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case EQEQUAL:                       /* == */
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Eq;
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case LESSEQUAL:
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return LtE;
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case GREATEREQUAL:
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return GtE;
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case NOTEQUAL:
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NotEq;
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case NAME:
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (strcmp(STR(n), "in") == 0)
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return In;
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (strcmp(STR(n), "is") == 0)
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return Is;
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             STR(n));
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (cmpop_ty)0;
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(n) == 2) {
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* handle "not in" and "is not" */
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(CHILD(n, 0))) {
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case NAME:
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (strcmp(STR(CHILD(n, 1)), "in") == 0)
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NotIn;
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (strcmp(STR(CHILD(n, 0)), "is") == 0)
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return IsNot;
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             STR(CHILD(n, 0)), STR(CHILD(n, 1)));
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (cmpop_ty)0;
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NCH(n));
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return (cmpop_ty)0;
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmseq_for_testlist(struct compiling *c, const node *n)
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist: test (',' test)* [','] */
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *seq;
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expression;
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(TYPE(n) == testlist ||
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           TYPE(n) == listmaker ||
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           TYPE(n) == testlist_comp ||
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           TYPE(n) == testlist_safe ||
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           TYPE(n) == testlist1);
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!seq)
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i += 2) {
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test);
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, i));
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(i / 2 < seq->size);
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(seq, i / 2, expression);
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return seq;
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcompiler_complex_args(struct compiling *c, const node *n)
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, len = (NCH(n) + 1) / 2;
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty result;
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *args = asdl_seq_new(len, c->c_arena);
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!args)
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* fpdef: NAME | '(' fplist ')'
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       fplist: fpdef (',' fpdef)* [',']
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, fplist);
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < len; i++) {
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *arg_id;
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const node *fpdef_node = CHILD(n, 2*i);
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const node *child;
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty arg;
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmset_name:
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* fpdef_node is either a NAME or an fplist */
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        child = CHILD(fpdef_node, 0);
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(child) == NAME) {
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!forbidden_check(c, n, STR(child)))
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            arg_id = NEW_IDENTIFIER(child);
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!arg_id)
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            arg = Name(arg_id, Store, LINENO(child), child->n_col_offset,
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       c->c_arena);
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(TYPE(fpdef_node) == fpdef);
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            child = CHILD(fpdef_node, 1);
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(TYPE(child) == fplist);
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* NCH == 1 means we have (x), we need to elide the extra parens */
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(child) == 1) {
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fpdef_node = CHILD(child, 0);
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(TYPE(fpdef_node) == fpdef);
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto set_name;
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            arg = compiler_complex_args(c, child);
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(args, i, arg);
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!set_context(c, result, Store, n))
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return result;
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create AST for argument list. */
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic arguments_ty
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_arguments(struct compiling *c, const node *n)
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* parameters: '(' [varargslist] ')'
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME]
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, j, k, n_args = 0, n_defaults = 0, found_default = 0;
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *args, *defaults;
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    identifier vararg = NULL, kwarg = NULL;
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == parameters) {
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 2) /* () as argument list */
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return arguments(NULL, NULL, NULL, NULL, c->c_arena);
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 1);
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, varargslist);
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* first count the number of normal args & defaults */
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i++) {
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, i);
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == fpdef)
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_args++;
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == EQUAL)
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_defaults++;
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL);
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!args && n_args)
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL);
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!defaults && n_defaults)
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* fpdef: NAME | '(' fplist ')'
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       fplist: fpdef (',' fpdef)* [',']
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = 0;
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    j = 0;  /* index for defaults */
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    k = 0;  /* index for args */
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (i < NCH(n)) {
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, i);
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(ch)) {
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case fpdef: {
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                int complex_args = 0, parenthesized = 0;
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            handle_fpdef:
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   anything other than EQUAL or a comma? */
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* XXX Should NCH(n) check be made a separate check? */
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!expression)
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    assert(defaults != NULL);
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(defaults, j++, expression);
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    i += 2;
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    found_default = 1;
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else if (found_default) {
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* def f((x)=4): pass should raise an error.
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       def f((x, (y))): pass will just incur the tuple unpacking warning. */
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (parenthesized && !complex_args) {
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        ast_error(n, "parenthesized arg with default");
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(n,
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "non-default argument follows default argument");
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (NCH(ch) == 3) {
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ch = CHILD(ch, 1);
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* def foo((x)): is not complex, special case. */
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (NCH(ch) != 1) {
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        /* We have complex arguments, setup for unpacking. */
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (Py_Py3kWarningFlag && !ast_warn(c, ch,
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "tuple parameter unpacking has been removed in 3.x"))
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            return NULL;
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        complex_args = 1;
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (!asdl_seq_GET(args, k-1))
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                return NULL;
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    } else {
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        /* def foo((x)): setup for checking NAME below. */
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        /* Loop because there can be many parens and tuple
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           unpacking mixed in. */
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        parenthesized = 1;
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        ch = CHILD(ch, 0);
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        assert(TYPE(ch) == fpdef);
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        goto handle_fpdef;
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (TYPE(CHILD(ch, 0)) == NAME) {
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyObject *id;
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expr_ty name;
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!forbidden_check(c, n, STR(CHILD(ch, 0))))
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    id = NEW_IDENTIFIER(CHILD(ch, 0));
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!id)
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    name = Name(id, Param, LINENO(ch), ch->n_col_offset,
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                c->c_arena);
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!name)
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(args, k++, name);
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                i += 2; /* the name and the comma */
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (parenthesized && Py_Py3kWarningFlag &&
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    !ast_warn(c, ch, "parenthesized argument names "
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "are invalid in 3.x"))
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case STAR:
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                vararg = NEW_IDENTIFIER(CHILD(n, i+1));
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!vararg)
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                i += 3;
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case DOUBLESTAR:
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1))))
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                kwarg = NEW_IDENTIFIER(CHILD(n, i+1));
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!kwarg)
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                i += 3;
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_SystemError,
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "unexpected node in varargslist: %d @ %d",
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             TYPE(ch), i);
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return arguments(args, vararg, kwarg, defaults, c->c_arena);
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_dotted_name(struct compiling *c, const node *n)
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty e;
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    identifier id;
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int lineno, col_offset;
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, dotted_name);
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    lineno = LINENO(n);
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    col_offset = n->n_col_offset;
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    id = NEW_IDENTIFIER(CHILD(n, 0));
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!id)
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = Name(id, Load, lineno, col_offset, c->c_arena);
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!e)
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 2; i < NCH(n); i+=2) {
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        id = NEW_IDENTIFIER(CHILD(n, i));
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!id)
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!e)
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return e;
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_decorator(struct compiling *c, const node *n)
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty d = NULL;
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty name_expr;
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, decorator);
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(CHILD(n, 0), AT);
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(RCHILD(n, -1), NEWLINE);
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    name_expr = ast_for_dotted_name(c, CHILD(n, 1));
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!name_expr)
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 3) { /* No arguments */
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = name_expr;
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name_expr = NULL;
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(n) == 5) { /* Call with no arguments */
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n),
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 n->n_col_offset, c->c_arena);
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!d)
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name_expr = NULL;
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = ast_for_call(c, CHILD(n, 3), name_expr);
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!d)
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name_expr = NULL;
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return d;
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq*
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_decorators(struct compiling *c, const node *n)
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq* decorator_seq;
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty d;
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, decorators);
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    decorator_seq = asdl_seq_new(NCH(n), c->c_arena);
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!decorator_seq)
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i++) {
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = ast_for_decorator(c, CHILD(n, i));
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!d)
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(decorator_seq, i, d);
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return decorator_seq;
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* funcdef: 'def' NAME parameters ':' suite */
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    identifier name;
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments_ty args;
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *body;
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int name_i = 1;
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, funcdef);
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    name = NEW_IDENTIFIER(CHILD(n, name_i));
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!name)
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i))))
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    args = ast_for_arguments(c, CHILD(n, name_i + 1));
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!args)
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    body = ast_for_suite(c, CHILD(n, name_i + 3));
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!body)
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return FunctionDef(name, args, body, decorator_seq, LINENO(n),
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       n->n_col_offset, c->c_arena);
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_decorated(struct compiling *c, const node *n)
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* decorated: decorators (classdef | funcdef) */
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    stmt_ty thing = NULL;
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *decorator_seq = NULL;
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, decorated);
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    decorator_seq = ast_for_decorators(c, CHILD(n, 0));
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!decorator_seq)
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      return NULL;
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(TYPE(CHILD(n, 1)) == funcdef ||
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm	   TYPE(CHILD(n, 1)) == classdef);
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, 1)) == funcdef) {
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (TYPE(CHILD(n, 1)) == classdef) {
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* we count the decorators in when talking about the class' or
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       function's line number */
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (thing) {
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        thing->lineno = LINENO(n);
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        thing->col_offset = n->n_col_offset;
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return thing;
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_lambdef(struct compiling *c, const node *n)
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* lambdef: 'lambda' [varargslist] ':' test */
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    arguments_ty args;
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expression;
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 3) {
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = arguments(NULL, NULL, NULL, NULL, c->c_arena);
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!args)
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 2));
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        args = ast_for_arguments(c, CHILD(n, 1));
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!args)
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 3));
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_ifexpr(struct compiling *c, const node *n)
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* test: or_test 'if' or_test 'else' test */
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expression, body, orelse;
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) == 5);
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    body = ast_for_expr(c, CHILD(n, 0));
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!body)
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expression = ast_for_expr(c, CHILD(n, 2));
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!expression)
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    orelse = ast_for_expr(c, CHILD(n, 4));
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!orelse)
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 c->c_arena);
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* XXX(nnorwitz): the listcomp and genexpr code should be refactored
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   so there is only a single version.  Possibly for loops can also re-use
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   the code.
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Count the number of 'for' loop in a list comprehension.
10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Helper for ast_for_listcomp().
10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcount_list_fors(struct compiling *c, const node *n)
10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_fors = 0;
10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch = CHILD(n, 1);
10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count_list_for:
10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n_fors++;
10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(ch, list_for);
10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(ch) == 5)
10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(ch, 4);
10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return n_fors;
10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count_list_iter:
10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(ch, list_iter);
10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ch = CHILD(ch, 0);
10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(ch) == list_for)
10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto count_list_for;
10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(ch) == list_if) {
10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(ch) == 3) {
10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(ch, 2);
10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto count_list_iter;
10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return n_fors;
10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Should never be reached */
10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors");
10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return -1;
10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Count the number of 'if' statements in a list comprehension.
10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Helper for ast_for_listcomp().
10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcount_list_ifs(struct compiling *c, const node *n)
10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_ifs = 0;
10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm count_list_iter:
10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, list_iter);
10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, 0)) == list_for)
10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return n_ifs;
10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = CHILD(n, 0);
10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, list_if);
10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n_ifs++;
10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 2)
10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return n_ifs;
10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = CHILD(n, 2);
10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    goto count_list_iter;
10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_listcomp(struct compiling *c, const node *n)
10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* listmaker: test ( list_for | (',' test)* [','] )
10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       list_for: 'for' exprlist 'in' testlist_safe [list_iter]
10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       list_iter: list_for | list_if
10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       list_if: 'if' test [list_iter]
10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       testlist_safe: test [(',' test)+ [',']]
10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty elt, first;
10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *listcomps;
10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, n_fors;
10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, listmaker);
10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) > 1);
10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    elt = ast_for_expr(c, CHILD(n, 0));
10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!elt)
10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n_fors = count_list_fors(c, n);
10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_fors == -1)
10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    listcomps = asdl_seq_new(n_fors, c->c_arena);
10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!listcomps)
10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ch = CHILD(n, 1);
10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n_fors; i++) {
10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        comprehension_ty lc;
10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *t;
10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *for_ch;
10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(ch, list_for);
10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for_ch = CHILD(ch, 1);
11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        t = ast_for_exprlist(c, for_ch, Store);
11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!t)
11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_testlist(c, CHILD(ch, 3));
11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Check the # of children rather than the length of t, since
11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           [x for x, in ... ] has 1 element in t, but still requires a Tuple.
11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        first = (expr_ty)asdl_seq_GET(t, 0);
11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(for_ch) == 1)
11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            lc = comprehension(first, expression, NULL, c->c_arena);
11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            lc = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     c->c_arena),
11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               expression, NULL, c->c_arena);
11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!lc)
11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(ch) == 5) {
11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int j, n_ifs;
11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *ifs;
11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty list_for_expr;
11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(ch, 4);
11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_ifs = count_list_ifs(c, ch);
11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (n_ifs == -1)
11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ifs = asdl_seq_new(n_ifs, c->c_arena);
11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!ifs)
11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (j = 0; j < n_ifs; j++) {
11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(ch, list_iter);
11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ch = CHILD(ch, 0);
11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(ch, list_if);
11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                list_for_expr = ast_for_expr(c, CHILD(ch, 1));
11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!list_for_expr)
11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(ifs, j, list_for_expr);
11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (NCH(ch) == 3)
11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ch = CHILD(ch, 2);
11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* on exit, must guarantee that ch is a list_for */
11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(ch) == list_iter)
11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ch = CHILD(ch, 0);
11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            lc->ifs = ifs;
11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(listcomps, i, lc);
11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena);
11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/*
11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Count the number of 'for' loops in a comprehension.
11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Helper for ast_for_comprehension().
11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcount_comp_fors(struct compiling *c, const node *n)
11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_fors = 0;
11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  count_comp_for:
11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n_fors++;
11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, comp_for);
11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 5)
11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 4);
11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return n_fors;
11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm  count_comp_iter:
11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, comp_iter);
11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = CHILD(n, 0);
11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == comp_for)
11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        goto count_comp_for;
11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(n) == comp_if) {
11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 3) {
11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = CHILD(n, 2);
11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            goto count_comp_iter;
11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return n_fors;
11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Should never be reached */
11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_SystemError,
11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "logic error in count_comp_fors");
11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return -1;
11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Count the number of 'if' statements in a comprehension.
11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm   Helper for ast_for_comprehension().
11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int
12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcount_comp_ifs(struct compiling *c, const node *n)
12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_ifs = 0;
12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while (1) {
12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(n, comp_iter);
12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(CHILD(n, 0)) == comp_for)
12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return n_ifs;
12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(n, comp_if);
12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n_ifs++;
12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 2)
12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return n_ifs;
12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 2);
12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *
12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_comprehension(struct compiling *c, const node *n)
12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, n_fors;
12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *comps;
12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n_fors = count_comp_fors(c, n);
12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_fors == -1)
12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    comps = asdl_seq_new(n_fors, c->c_arena);
12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!comps)
12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < n_fors; i++) {
12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        comprehension_ty comp;
12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *t;
12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression, first;
12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *for_ch;
12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(n, comp_for);
12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for_ch = CHILD(n, 1);
12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        t = ast_for_exprlist(c, for_ch, Store);
12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!t)
12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 3));
12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Check the # of children rather than the length of t, since
12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           (x for x, in ...) has 1 element in t, but still requires a Tuple. */
12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        first = (expr_ty)asdl_seq_GET(t, 0);
12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(for_ch) == 1)
12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            comp = comprehension(first, expression, NULL, c->c_arena);
12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     c->c_arena),
12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               expression, NULL, c->c_arena);
12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!comp)
12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 5) {
12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int j, n_ifs;
12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *ifs;
12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = CHILD(n, 4);
12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_ifs = count_comp_ifs(c, n);
12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (n_ifs == -1)
12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ifs = asdl_seq_new(n_ifs, c->c_arena);
12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!ifs)
12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (j = 0; j < n_ifs; j++) {
12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(n, comp_iter);
12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(n, comp_if);
12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expression = ast_for_expr(c, CHILD(n, 1));
12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(ifs, j, expression);
12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (NCH(n) == 3)
12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n = CHILD(n, 2);
12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* on exit, must guarantee that n is a comp_for */
12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(n) == comp_iter)
12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            comp->ifs = ifs;
12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(comps, i, comp);
12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return comps;
12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_itercomp(struct compiling *c, const node *n, int type)
12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty elt;
13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *comps;
13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) > 1);
13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    elt = ast_for_expr(c, CHILD(n, 0));
13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!elt)
13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    comps = ast_for_comprehension(c, CHILD(n, 1));
13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!comps)
13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (type == COMP_GENEXP)
13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (type == COMP_SETCOMP)
13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Should never happen */
13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_dictcomp(struct compiling *c, const node *n)
13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty key, value;
13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *comps;
13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) > 3);
13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(CHILD(n, 1), COLON);
13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    key = ast_for_expr(c, CHILD(n, 0));
13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!key)
13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    value = ast_for_expr(c, CHILD(n, 2));
13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!value)
13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    comps = ast_for_comprehension(c, CHILD(n, 3));
13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!comps)
13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_genexp(struct compiling *c, const node *n)
13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ast_for_itercomp(c, n, COMP_GENEXP);
13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_setcomp(struct compiling *c, const node *n)
13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(TYPE(n) == (dictorsetmaker));
13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ast_for_itercomp(c, n, COMP_SETCOMP);
13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_atom(struct compiling *c, const node *n)
13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [listmaker] ']'
13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch = CHILD(n, 0);
13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(ch)) {
13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case NAME: {
13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* All names start in Load context, but may later be
13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           changed. */
13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *name = NEW_IDENTIFIER(ch);
13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!name)
13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case STRING: {
13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *str = parsestrplus(c, n);
13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!str) {
13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (PyErr_ExceptionMatches(PyExc_UnicodeError)){
13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyObject *type, *value, *tback, *errstr;
13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Fetch(&type, &value, &tback);
13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                errstr = PyObject_Str(value);
13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (errstr) {
13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    char *s = "";
13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    char buf[128];
13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s = PyString_AsString(errstr);
13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(n, buf);
13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    Py_DECREF(errstr);
13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                } else {
13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(n, "(unicode error) unknown error");
13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(type);
13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_DECREF(value);
13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Py_XDECREF(tback);
13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyArena_AddPyObject(c->c_arena, str);
14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case NUMBER: {
14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *pynum = parsenumber(c, STR(ch));
14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!pynum)
14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyArena_AddPyObject(c->c_arena, pynum);
14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case LPAR: /* some parenthesized expressions */
14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, 1);
14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == RPAR)
14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == yield_expr)
14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_expr(c, ch);
14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_for_testlist_comp(c, ch);
14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case LSQB: /* list (or list comprehension) */
14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, 1);
14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == RSQB)
14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(ch, listmaker);
14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *elts = seq_for_testlist(c, ch);
14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!elts)
14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_listcomp(c, ch);
14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case LBRACE: {
14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* dictorsetmaker:
14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *    (test ':' test (comp_for | (',' test ':' test)* [','])) |
14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         *    (test (comp_for | (',' test)* [',']))
14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         */
14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i, size;
14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *keys, *values;
14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, 1);
14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == RBRACE) {
14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* it's an empty dict */
14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* it's a simple set */
14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *elts;
14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */
14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elts = asdl_seq_new(size, c->c_arena);
14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!elts)
14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(ch); i += 2) {
14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression;
14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expression = ast_for_expr(c, CHILD(ch, i));
14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(elts, i / 2, expression);
14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (TYPE(CHILD(ch, 1)) == comp_for) {
14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* it's a set comprehension */
14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_setcomp(c, ch);
14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) {
14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_dictcomp(c, ch);
14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* it's a dict */
14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */
14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            keys = asdl_seq_new(size, c->c_arena);
14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!keys)
14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            values = asdl_seq_new(size, c->c_arena);
14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!values)
14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(ch); i += 4) {
14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression;
14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expression = ast_for_expr(c, CHILD(ch, i));
14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(keys, i / 4, expression);
14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expression = ast_for_expr(c, CHILD(ch, i + 2));
14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(values, i / 4, expression);
14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    case BACKQUOTE: { /* repr */
15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (Py_Py3kWarningFlag &&
15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            !ast_warn(c, n, "backquote not supported in 3.x; use repr()"))
15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_testlist(c, CHILD(n, 1));
15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena);
15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    default:
15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic slice_ty
15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_slice(struct compiling *c, const node *n)
15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty lower = NULL, upper = NULL, step = NULL;
15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, subscript);
15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       sliceop: ':' [test]
15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ch = CHILD(n, 0);
15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(ch) == DOT)
15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Ellipsis(c->c_arena);
15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1 && TYPE(ch) == test) {
15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* 'step' variable hold no significance in terms of being used over
15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           other vars */
15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        step = ast_for_expr(c, ch);
15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!step)
15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Index(step, c->c_arena);
15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(ch) == test) {
15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        lower = ast_for_expr(c, ch);
15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!lower)
15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If there's an upper bound it's in the second or third position. */
15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(ch) == COLON) {
15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) > 1) {
15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            node *n2 = CHILD(n, 1);
15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(n2) == test) {
15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                upper = ast_for_expr(c, n2);
15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!upper)
15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    } else if (NCH(n) > 2) {
15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *n2 = CHILD(n, 2);
15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(n2) == test) {
15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            upper = ast_for_expr(c, n2);
15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!upper)
15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ch = CHILD(n, NCH(n) - 1);
15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(ch) == sliceop) {
15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(ch) == 1) {
15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /*
15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              This is an extended slice (ie "x[::]") with no expression in the
15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              step field. We set this literally to "None" in order to
15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              disambiguate it from x[:]. (The interpreter might have to call
15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              __getslice__ for x[:], but it must call __getitem__ for x[::].)
15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            */
15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            identifier none = new_identifier("None", c->c_arena);
15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!none)
15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(ch, 0);
15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            step = Name(none, Load, LINENO(ch), ch->n_col_offset, c->c_arena);
15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!step)
15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        } else {
15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(ch, 1);
15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(ch) == test) {
15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                step = ast_for_expr(c, ch);
15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!step)
15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Slice(lower, upper, step, c->c_arena);
15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_binop(struct compiling *c, const node *n)
16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* Must account for a sequence of expressions.
16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           How should A op B op C by represented?
16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           BinOp(BinOp(A, op, B), op, C).
16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i, nops;
16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expr1, expr2, result;
16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        operator_ty newoperator;
16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr1 = ast_for_expr(c, CHILD(n, 0));
16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr1)
16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr2 = ast_for_expr(c, CHILD(n, 2));
16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr2)
16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        newoperator = get_operator(CHILD(n, 1));
16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!newoperator)
16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                       c->c_arena);
16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!result)
16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nops = (NCH(n) - 1) / 2;
16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 1; i < nops; i++) {
16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty tmp_result, tmp;
16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                const node* next_oper = CHILD(n, i * 2 + 1);
16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                newoperator = get_operator(next_oper);
16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!newoperator)
16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!tmp)
16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tmp_result = BinOp(result, newoperator, tmp,
16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   LINENO(next_oper), next_oper->n_col_offset,
16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                   c->c_arena);
16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!tmp_result)
16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                result = tmp_result;
16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return result;
16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       subscriptlist: subscript (',' subscript)* [',']
16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, trailer);
16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, 0)) == LPAR) {
16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 2)
16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n),
16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        n->n_col_offset, c->c_arena);
16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_call(c, CHILD(n, 1), left_expr);
16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(CHILD(n, 0)) == DOT ) {
16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!attr_id)
16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Attribute(left_expr, attr_id, Load,
16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         LINENO(n), n->n_col_offset, c->c_arena);
16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(CHILD(n, 0), LSQB);
16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(CHILD(n, 2), RSQB);
16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 1);
16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) == 1) {
16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            slice_ty slc = ast_for_slice(c, CHILD(n, 0));
16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!slc)
16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             c->c_arena);
16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* The grammar is ambiguous here. The ambiguity is resolved
16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               by treating the sequence as a tuple literal if there are
16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               no slice features.
16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            */
16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int j;
16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            slice_ty slc;
16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty e;
16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bool simple = true;
16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *slices, *elts;
16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!slices)
16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (j = 0; j < NCH(n); j += 2) {
16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                slc = ast_for_slice(c, CHILD(n, j));
16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!slc)
16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (slc->kind != Index_kind)
17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    simple = false;
17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(slices, j / 2, slc);
17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!simple) {
17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Subscript(left_expr, ExtSlice(slices, c->c_arena),
17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 Load, LINENO(n), n->n_col_offset, c->c_arena);
17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* extract Index values and put them in a Tuple */
17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!elts)
17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (j = 0; j < asdl_seq_LEN(slices); ++j) {
17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                slc = (slice_ty)asdl_seq_GET(slices, j);
17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(slc->kind == Index_kind  && slc->v.Index.value);
17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(elts, j, slc->v.Index.value);
17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!e)
17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Subscript(left_expr, Index(e, c->c_arena),
17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             Load, LINENO(n), n->n_col_offset, c->c_arena);
17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_factor(struct compiling *c, const node *n)
17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *pfactor, *ppower, *patom, *pnum;
17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expression;
17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* If the unary - operator is applied to a constant, don't generate
17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       a UNARY_NEGATIVE opcode.  Just store the approriate value as a
17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       constant.  The peephole optimizer already does something like
17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       this but it doesn't handle the case where the constant is
17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       (sys.maxint - 1).  In that case, we want a PyIntObject, not a
17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       PyLongObject.
17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, 0)) == MINUS &&
17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NCH(n) == 2 &&
17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TYPE((pfactor = CHILD(n, 1))) == factor &&
17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NCH(pfactor) == 1 &&
17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TYPE((ppower = CHILD(pfactor, 0))) == power &&
17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        NCH(ppower) == 1 &&
17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TYPE((patom = CHILD(ppower, 0))) == atom &&
17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        TYPE((pnum = CHILD(patom, 0))) == NUMBER) {
17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s == NULL)
17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s[0] = '-';
17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strcpy(s + 1, STR(pnum));
17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject_FREE(STR(pnum));
17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        STR(pnum) = s;
17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_for_atom(c, patom);
17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expression = ast_for_expr(c, CHILD(n, 1));
17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!expression)
17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(CHILD(n, 0))) {
17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case PLUS:
17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           c->c_arena);
17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case MINUS:
17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           c->c_arena);
17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case TILDE:
17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return UnaryOp(Invert, expression, LINENO(n),
17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           n->n_col_offset, c->c_arena);
17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 TYPE(CHILD(n, 0)));
17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_power(struct compiling *c, const node *n)
17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* power: atom trailer* ('**' factor)*
17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty e, tmp;
17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, power);
17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    e = ast_for_atom(c, CHILD(n, 0));
17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!e)
17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1)
17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return e;
17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 1; i < NCH(n); i++) {
17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *ch = CHILD(n, i);
17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) != trailer)
17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tmp = ast_for_trailer(c, ch, e);
17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!tmp)
17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tmp->lineno = e->lineno;
17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tmp->col_offset = e->col_offset;
17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        e = tmp;
18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!f)
18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!tmp)
18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        e = tmp;
18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return e;
18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Do not name a variable 'expr'!  Will cause a compile error.
18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/
18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_expr(struct compiling *c, const node *n)
18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* handle the full range of simple expressions
18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       test: or_test ['if' or_test 'else' test] | lambdef
18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       or_test: and_test ('or' and_test)*
18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       and_test: not_test ('and' not_test)*
18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       not_test: 'not' not_test | comparison
18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       comparison: expr (comp_op expr)*
18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       expr: xor_expr ('|' xor_expr)*
18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       xor_expr: and_expr ('^' and_expr)*
18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       and_expr: shift_expr ('&' shift_expr)*
18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       shift_expr: arith_expr (('<<'|'>>') arith_expr)*
18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       arith_expr: term (('+'|'-') term)*
18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       term: factor (('*'|'/'|'%'|'//') factor)*
18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       factor: ('+'|'-'|'~') factor | power
18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       power: atom trailer* ('**' factor)*
18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       As well as modified versions that exist for backward compatibility,
18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       to explicitly allow:
18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       [ x for x in lambda: 0, lambda: 1 ]
18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       (which would be ambiguous without these extra rules)
18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       old_test: or_test | old_lambdef
18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       old_lambdef: 'lambda' [vararglist] ':' old_test
18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *seq;
18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loop:
18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(n)) {
18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case test:
18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case old_test:
18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(CHILD(n, 0)) == lambdef ||
18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                TYPE(CHILD(n, 0)) == old_lambdef)
18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_lambdef(c, CHILD(n, 0));
18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (NCH(n) > 1)
18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_ifexpr(c, n);
18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* Fallthrough */
18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case or_test:
18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case and_test:
18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!seq)
18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(n); i += 2) {
18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty e = ast_for_expr(c, CHILD(n, i));
18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!e)
18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(seq, i / 2, e);
18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!strcmp(STR(CHILD(n, 1)), "and"))
18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return BoolOp(And, seq, LINENO(n), n->n_col_offset,
18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              c->c_arena);
18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(!strcmp(STR(CHILD(n, 1)), "or"));
18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case not_test:
18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression = ast_for_expr(c, CHILD(n, 1));
18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               c->c_arena);
18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case comparison:
18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression;
18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_int_seq *ops;
18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq *cmps;
18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena);
19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!ops)
19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                cmps = asdl_seq_new(NCH(n) / 2, c->c_arena);
19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!cmps) {
19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 1; i < NCH(n); i += 2) {
19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    cmpop_ty newoperator;
19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    newoperator = ast_for_comp_op(c, CHILD(n, i));
19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!newoperator) {
19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    expression = ast_for_expr(c, CHILD(n, i + 1));
19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!expression) {
19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(ops, i / 2, newoperator);
19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(cmps, i / 2, expression);
19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expression = ast_for_expr(c, CHILD(n, 0));
19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression) {
19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Compare(expression, ops, cmps, LINENO(n),
19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                               n->n_col_offset, c->c_arena);
19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* The next five cases all handle BinOps.  The main body of code
19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           is the same in each case, but the switch turned inside out to
19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           reuse the code for each type of operator.
19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         */
19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case expr:
19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case xor_expr:
19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case and_expr:
19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case shift_expr:
19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case arith_expr:
19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case term:
19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_binop(c, n);
19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case yield_expr: {
19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty exp = NULL;
19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 2) {
19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                exp = ast_for_testlist(c, CHILD(n, 1));
19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!exp)
19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case factor:
19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_factor(c, n);
19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case power:
19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ast_for_power(c, n);
19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* should never get here unless if error is set */
19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_call(struct compiling *c, const node *n, expr_ty func)
19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               | '**' test)
19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      argument: [test '='] test [comp_for]        # Really [keyword '='] test
19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, nargs, nkeywords, ngens;
19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *args;
19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *keywords;
19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty vararg = NULL, kwarg = NULL;
19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, arglist);
19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nargs = 0;
19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nkeywords = 0;
19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ngens = 0;
19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i++) {
19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *ch = CHILD(n, i);
19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == argument) {
19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(ch) == 1)
19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                nargs++;
19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (TYPE(CHILD(ch, 1)) == comp_for)
19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ngens++;
19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else
19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                nkeywords++;
20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (ngens > 1 || (ngens && (nargs || nkeywords))) {
20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ast_error(n, "Generator expression must be parenthesized "
20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  "if not sole argument");
20054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (nargs + nkeywords + ngens > 255) {
20094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      ast_error(n, "more than 255 arguments");
20104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      return NULL;
20114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
20124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    args = asdl_seq_new(nargs + ngens, c->c_arena);
20144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!args)
20154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    keywords = asdl_seq_new(nkeywords, c->c_arena);
20174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!keywords)
20184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
20194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nargs = 0;
20204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nkeywords = 0;
20214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i++) {
20224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *ch = CHILD(n, i);
20234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == argument) {
20244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty e;
20254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(ch) == 1) {
20264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (nkeywords) {
20274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(CHILD(ch, 0),
20284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "non-keyword arg after keyword arg");
20294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (vararg) {
20324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(CHILD(ch, 0),
20334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "only named arguments may follow *expression");
20344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = ast_for_expr(c, CHILD(ch, 0));
20374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!e)
20384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(args, nargs++, e);
20404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (TYPE(CHILD(ch, 1)) == comp_for) {
20424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = ast_for_genexp(c, ch);
20434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!e)
20444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(args, nargs++, e);
20464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
20484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                keyword_ty kw;
20494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                identifier key;
20504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                int k;
20514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *tmp;
20524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
20534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* CHILD(ch, 0) is test, but must be an identifier? */
20544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = ast_for_expr(c, CHILD(ch, 0));
20554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!e)
20564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* f(lambda x: x[0] = 3) ends up getting parsed with
20584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * LHS test = lambda x: x[0], and RHS test = 3.
20594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * SF bug 132313 points out that complaining about a keyword
20604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 * then is very confusing.
20614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 */
20624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (e->kind == Lambda_kind) {
20634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(CHILD(ch, 0),
20644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              "lambda cannot contain assignment");
20654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                } else if (e->kind != Name_kind) {
20674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ast_error(CHILD(ch, 0), "keyword can't be an expression");
20684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = e->v.Name.id;
20714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key)))
20724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (k = 0; k < nkeywords; k++) {
20744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    tmp = PyString_AS_STRING(
20754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        ((keyword_ty)asdl_seq_GET(keywords, k))->arg);
20764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!strcmp(tmp, PyString_AS_STRING(key))) {
20774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        ast_error(CHILD(ch, 0), "keyword argument repeated");
20784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
20794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
20804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
20814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                e = ast_for_expr(c, CHILD(ch, 2));
20824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!e)
20834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                kw = keyword(key, e, c->c_arena);
20854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!kw)
20864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
20874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(keywords, nkeywords++, kw);
20884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
20894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (TYPE(ch) == STAR) {
20914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            vararg = ast_for_expr(c, CHILD(n, i+1));
20924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!vararg)
20934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
20944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i++;
20954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
20964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else if (TYPE(ch) == DOUBLESTAR) {
20974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            kwarg = ast_for_expr(c, CHILD(n, i+1));
20984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!kwarg)
20994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
21004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            i++;
21014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
21024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Call(func, args, keywords, vararg, kwarg, func->lineno,
21054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                func->col_offset, c->c_arena);
21064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
21094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_testlist(struct compiling *c, const node* n)
21104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist_comp: test (',' test)* [','] */
21124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist: test (',' test)* [','] */
21134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist_safe: test (',' test)+ [','] */
21144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist1: test (',' test)* */
21154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) > 0);
21164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == testlist_comp) {
21174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (NCH(n) > 1)
21184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert(TYPE(CHILD(n, 1)) != comp_for);
21194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
21214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(TYPE(n) == testlist ||
21224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               TYPE(n) == testlist_safe ||
21234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               TYPE(n) == testlist1);
21244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1)
21264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_for_expr(c, CHILD(n, 0));
21274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
21284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *tmp = seq_for_testlist(c, n);
21294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!tmp)
21304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
21324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic expr_ty
21364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_testlist_comp(struct compiling *c, const node* n)
21374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
21394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* argument: test [ comp_for ] */
21404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(TYPE(n) == testlist_comp || TYPE(n) == argument);
21414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == comp_for)
21424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ast_for_genexp(c, n);
21434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ast_for_testlist(c, n);
21444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* like ast_for_testlist() but returns a sequence */
21474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq*
21484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_class_bases(struct compiling *c, const node* n)
21494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* testlist: test (',' test)* [','] */
21514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(NCH(n) > 0);
21524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, testlist);
21534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1) {
21544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty base;
21554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *bases = asdl_seq_new(1, c->c_arena);
21564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!bases)
21574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        base = ast_for_expr(c, CHILD(n, 0));
21594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!base)
21604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(bases, 0, base);
21624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return bases;
21634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return seq_for_testlist(c, n);
21664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
21674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
21694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_expr_stmt(struct compiling *c, const node *n)
21704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
21714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, expr_stmt);
21724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* expr_stmt: testlist (augassign (yield_expr|testlist)
21734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                | ('=' (yield_expr|testlist))*)
21744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       testlist: test (',' test)* [',']
21754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
21764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                | '<<=' | '>>=' | '**=' | '//='
21774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       test: ... here starts the operator precendence dance
21784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
21794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 1) {
21814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty e = ast_for_testlist(c, CHILD(n, 0));
21824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!e)
21834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
21864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
21874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(CHILD(n, 1)) == augassign) {
21884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expr1, expr2;
21894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        operator_ty newoperator;
21904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *ch = CHILD(n, 0);
21914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
21924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr1 = ast_for_testlist(c, ch);
21934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr1)
21944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if(!set_context(c, expr1, Store, ch))
21964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
21974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* set_context checks that most expressions are not the left side.
21984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          Augmented assignments can only have a name, a subscript, or an
21994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          attribute on the left, though, so we have to explicitly check for
22004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          those. */
22014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (expr1->kind) {
22024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case Name_kind:
22034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case Attribute_kind:
22044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case Subscript_kind:
22054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
22064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
22074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ast_error(ch, "illegal expression for augmented assignment");
22084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
22094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ch = CHILD(n, 2);
22124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(ch) == testlist)
22134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr2 = ast_for_testlist(c, ch);
22144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
22154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr2 = ast_for_expr(c, ch);
22164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr2)
22174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        newoperator = ast_for_augassign(c, CHILD(n, 1));
22204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!newoperator)
22214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
22244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         c->c_arena);
22254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
22274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
22284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *targets;
22294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *value;
22304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
22314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* a normal assignment */
22334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(CHILD(n, 1), EQUAL);
22344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
22354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!targets)
22364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < NCH(n) - 2; i += 2) {
22384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty e;
22394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            node *ch = CHILD(n, i);
22404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(ch) == yield_expr) {
22414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ast_error(ch, "assignment to yield expression not possible");
22424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
22434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
22444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            e = ast_for_testlist(c, ch);
22454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!e)
22464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
22474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* set context to assign */
22494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!set_context(c, e, Store, CHILD(n, i)))
22504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
22514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(targets, i / 2, e);
22534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        value = CHILD(n, NCH(n) - 1);
22554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(value) == testlist)
22564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expression = ast_for_testlist(c, value);
22574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
22584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expression = ast_for_expr(c, value);
22594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
22604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Assign(targets, expression, LINENO(n), n->n_col_offset,
22624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      c->c_arena);
22634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
22654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
22674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_print_stmt(struct compiling *c, const node *n)
22684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
22694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* print_stmt: 'print' ( [ test (',' test)* [','] ]
22704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             | '>>' test [ (',' test)+ [','] ] )
22714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     */
22724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty dest = NULL, expression;
22734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *seq = NULL;
22744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    bool nl;
22754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, j, values_count, start = 1;
22764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
22774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, print_stmt);
22784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
22794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dest = ast_for_expr(c, CHILD(n, 2));
22804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!dest)
22814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            start = 4;
22834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    values_count = (NCH(n) + 1 - start) / 2;
22854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (values_count) {
22864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq = asdl_seq_new(values_count, c->c_arena);
22874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq)
22884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
22894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = start, j = 0; i < NCH(n); i += 2, ++j) {
22904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expression = ast_for_expr(c, CHILD(n, i));
22914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!expression)
22924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
22934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(seq, j, expression);
22944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
22954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
22964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true;
22974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena);
22984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
22994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *
23014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
23024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *seq;
23044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
23054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty e;
23064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, exprlist);
23084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
23104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!seq)
23114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
23124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 0; i < NCH(n); i += 2) {
23134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        e = ast_for_expr(c, CHILD(n, i));
23144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!e)
23154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
23164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(seq, i / 2, e);
23174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (context && !set_context(c, e, context, CHILD(n, i)))
23184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
23194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
23204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return seq;
23214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
23244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_del_stmt(struct compiling *c, const node *n)
23254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *expr_list;
23274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* del_stmt: 'del' exprlist */
23294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, del_stmt);
23304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
23324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!expr_list)
23334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
23344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
23354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
23364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
23384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_flow_stmt(struct compiling *c, const node *n)
23394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
23404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
23414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
23424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 | yield_stmt
23434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      break_stmt: 'break'
23444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      continue_stmt: 'continue'
23454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      return_stmt: 'return' [testlist]
23464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      yield_stmt: yield_expr
23474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      yield_expr: 'yield' testlist
23484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      raise_stmt: 'raise' [test [',' test [',' test]]]
23494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
23504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
23514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, flow_stmt);
23534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ch = CHILD(n, 0);
23544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(ch)) {
23554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case break_stmt:
23564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Break(LINENO(n), n->n_col_offset, c->c_arena);
23574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case continue_stmt:
23584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Continue(LINENO(n), n->n_col_offset, c->c_arena);
23594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case yield_stmt: { /* will reduce to yield_expr */
23604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
23614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!exp)
23624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
23634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
23644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
23654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case return_stmt:
23664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(ch) == 1)
23674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
23684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
23694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
23704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
23714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
23724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Return(expression, LINENO(n), n->n_col_offset,
23734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              c->c_arena);
23744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
23754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case raise_stmt:
23764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(ch) == 1)
23774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset,
23784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             c->c_arena);
23794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (NCH(ch) == 2) {
23804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
23814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expression)
23824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
23834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Raise(expression, NULL, NULL, LINENO(n),
23844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             n->n_col_offset, c->c_arena);
23854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
23864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (NCH(ch) == 4) {
23874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expr1, expr2;
23884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr1 = ast_for_expr(c, CHILD(ch, 1));
23904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expr1)
23914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
23924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr2 = ast_for_expr(c, CHILD(ch, 3));
23934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expr2)
23944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
23954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
23964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset,
23974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             c->c_arena);
23984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
23994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else if (NCH(ch) == 6) {
24004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr_ty expr1, expr2, expr3;
24014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr1 = ast_for_expr(c, CHILD(ch, 1));
24034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expr1)
24044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr2 = ast_for_expr(c, CHILD(ch, 3));
24064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expr2)
24074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                expr3 = ast_for_expr(c, CHILD(ch, 5));
24094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!expr3)
24104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset,
24134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             c->c_arena);
24144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
24164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError,
24174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "unexpected flow_stmt: %d", TYPE(ch));
24184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
24194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
24204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_SystemError, "unhandled flow statement");
24224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
24234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
24244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic alias_ty
24264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmalias_for_import_name(struct compiling *c, const node *n, int store)
24274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
24284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
24294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      import_as_name: NAME ['as' NAME]
24304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      dotted_as_name: dotted_name ['as' NAME]
24314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      dotted_name: NAME ('.' NAME)*
24324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
24334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *str, *name;
24344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loop:
24364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    switch (TYPE(n)) {
24374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm         case import_as_name: {
24384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            node *name_node = CHILD(n, 0);
24394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            str = NULL;
24404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 3) {
24414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                node *str_node = CHILD(n, 2);
24424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (store && !forbidden_check(c, str_node, STR(str_node)))
24434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                str = NEW_IDENTIFIER(str_node);
24454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!str)
24464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
24494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!forbidden_check(c, name_node, STR(name_node)))
24504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            name = NEW_IDENTIFIER(name_node);
24534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!name)
24544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
24554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return alias(name, str, c->c_arena);
24564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
24574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case dotted_as_name:
24584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
24594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = CHILD(n, 0);
24604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                goto loop;
24614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
24634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                node *asname_node = CHILD(n, 2);
24644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
24654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!a)
24664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                assert(!a->asname);
24684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!forbidden_check(c, asname_node, STR(asname_node)))
24694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                a->asname = NEW_IDENTIFIER(asname_node);
24714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!a->asname)
24724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return a;
24744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
24764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case dotted_name:
24774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (NCH(n) == 1) {
24784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                node *name_node = CHILD(n, 0);
24794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (store && !forbidden_check(c, name_node, STR(name_node)))
24804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                name = NEW_IDENTIFIER(name_node);
24824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!name)
24834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
24844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return alias(name, NULL, c->c_arena);
24854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
24864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
24874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* Create a string of the form "a.b.c" */
24884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                int i;
24894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                size_t len;
24904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                char *s;
24914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
24924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = 0;
24934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 0; i < NCH(n); i += 2)
24944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* length of string plus one for the dot */
24954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    len += strlen(STR(CHILD(n, i))) + 1;
24964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len--; /* the last name doesn't have a dot */
24974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                str = PyString_FromStringAndSize(NULL, len);
24984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!str)
24994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
25004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = PyString_AS_STRING(str);
25014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!s)
25024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
25034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 0; i < NCH(n); i += 2) {
25044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    char *sch = STR(CHILD(n, i));
25054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    strcpy(s, STR(CHILD(n, i)));
25064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s += strlen(sch);
25074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    *s++ = '.';
25084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
25094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                --s;
25104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                *s = '\0';
25114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyString_InternInPlace(&str);
25124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyArena_AddPyObject(c->c_arena, str);
25134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return alias(str, NULL, c->c_arena);
25144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
25154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
25164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case STAR:
25174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            str = PyString_InternFromString("*");
25184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyArena_AddPyObject(c->c_arena, str);
25194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return alias(str, NULL, c->c_arena);
25204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
25214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            PyErr_Format(PyExc_SystemError,
25224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         "unexpected import name: %d", TYPE(n));
25234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
25244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
25274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
25284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
25294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
25314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_import_stmt(struct compiling *c, const node *n)
25324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
25334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /*
25344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      import_stmt: import_name | import_from
25354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      import_name: 'import' dotted_as_names
25364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm      import_from: 'from' ('.'* dotted_name | '.') 'import'
25374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          ('*' | '(' import_as_names ')' | import_as_names)
25384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
25394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int lineno;
25404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int col_offset;
25414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
25424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *aliases;
25434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, import_stmt);
25454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    lineno = LINENO(n);
25464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    col_offset = n->n_col_offset;
25474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    n = CHILD(n, 0);
25484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == import_name) {
25494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 1);
25504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(n, dotted_as_names);
25514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
25524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!aliases)
25534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
25544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < NCH(n); i += 2) {
25554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
25564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!import_alias)
25574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
25584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(aliases, i / 2, import_alias);
25594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
25604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Import(aliases, lineno, col_offset, c->c_arena);
25614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
25624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(n) == import_from) {
25634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int n_children;
25644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int idx, ndots = 0;
25654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        alias_ty mod = NULL;
25664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        identifier modname = NULL;
25674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
25684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       /* Count the number of dots (for relative imports) and check for the
25694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          optional module name */
25704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (idx = 1; idx < NCH(n); idx++) {
25714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (TYPE(CHILD(n, idx)) == dotted_name) {
25724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                mod = alias_for_import_name(c, CHILD(n, idx), 0);
25734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!mod)
25744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
25754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                idx++;
25764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
25774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            } else if (TYPE(CHILD(n, idx)) != DOT) {
25784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                break;
25794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
25804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ndots++;
25814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
25824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        idx++; /* skip over the 'import' keyword */
25834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(CHILD(n, idx))) {
25844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case STAR:
25854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* from ... import * */
25864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = CHILD(n, idx);
25874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_children = 1;
25884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
25894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case LPAR:
25904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* from ... import (x, y, z) */
25914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = CHILD(n, idx + 1);
25924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_children = NCH(n);
25934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
25944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        case import_as_names:
25954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* from ... import x, y, z */
25964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = CHILD(n, idx);
25974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_children = NCH(n);
25984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (n_children % 2 == 0) {
25994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ast_error(n, "trailing comma not allowed without"
26004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             " surrounding parentheses");
26014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
26024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
26034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
26044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        default:
26054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ast_error(n, "Unexpected node-type in from-import");
26064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
26074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
26084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena);
26104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!aliases)
26114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
26124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* handle "from ... import *" special b/c there's no children */
26144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(n) == STAR) {
26154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            alias_ty import_alias = alias_for_import_name(c, n, 1);
26164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!import_alias)
26174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
26184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(aliases, 0, import_alias);
26194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
26204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
26214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (i = 0; i < NCH(n); i += 2) {
26224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
26234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!import_alias)
26244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
26254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(aliases, i / 2, import_alias);
26264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
26274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
26284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (mod != NULL)
26294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            modname = mod->name;
26304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ImportFrom(modname, aliases, ndots, lineno, col_offset,
26314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          c->c_arena);
26324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError,
26344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "unknown import statement: starts with command '%s'",
26354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 STR(CHILD(n, 0)));
26364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
26374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
26404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_global_stmt(struct compiling *c, const node *n)
26414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
26424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* global_stmt: 'global' NAME (',' NAME)* */
26434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    identifier name;
26444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *s;
26454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
26464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, global_stmt);
26484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = asdl_seq_new(NCH(n) / 2, c->c_arena);
26494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!s)
26504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (i = 1; i < NCH(n); i += 2) {
26524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        name = NEW_IDENTIFIER(CHILD(n, i));
26534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!name)
26544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
26554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(s, i / 2, name);
26564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
26584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
26614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_exec_stmt(struct compiling *c, const node *n)
26624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
26634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expr1, globals = NULL, locals = NULL;
26644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_children = NCH(n);
26654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_children != 2 && n_children != 4 && n_children != 6) {
26664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyErr_Format(PyExc_SystemError,
26674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     "poorly formed 'exec' statement: %d parts to statement",
26684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     n_children);
26694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* exec_stmt: 'exec' expr ['in' test [',' test]] */
26734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, exec_stmt);
26744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr1 = ast_for_expr(c, CHILD(n, 1));
26754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!expr1)
26764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
26774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_children >= 4) {
26784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        globals = ast_for_expr(c, CHILD(n, 3));
26794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!globals)
26804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
26814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_children == 6) {
26834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        locals = ast_for_expr(c, CHILD(n, 5));
26844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!locals)
26854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
26864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
26874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset,
26894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                c->c_arena);
26904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
26914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
26924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
26934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_assert_stmt(struct compiling *c, const node *n)
26944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
26954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* assert_stmt: 'assert' test [',' test] */
26964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, assert_stmt);
26974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 2) {
26984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression = ast_for_expr(c, CHILD(n, 1));
26994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
27004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
27014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Assert(expression, NULL, LINENO(n), n->n_col_offset,
27024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                      c->c_arena);
27034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(n) == 4) {
27054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expr1, expr2;
27064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr1 = ast_for_expr(c, CHILD(n, 1));
27084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr1)
27094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
27104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr2 = ast_for_expr(c, CHILD(n, 3));
27114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expr2)
27124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
27134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
27154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError,
27174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "improper number of parts to 'assert' statement: %d",
27184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NCH(n));
27194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
27204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
27214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic asdl_seq *
27234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_suite(struct compiling *c, const node *n)
27244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
27254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
27264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *seq;
27274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    stmt_ty s;
27284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i, total, num, end, pos = 0;
27294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node *ch;
27304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, suite);
27324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    total = num_stmts(n);
27344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    seq = asdl_seq_new(total, c->c_arena);
27354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!seq)
27364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
27374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, 0)) == simple_stmt) {
27384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
27394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* simple_stmt always ends with a NEWLINE,
27404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           and may have a trailing SEMI
27414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
27424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        end = NCH(n) - 1;
27434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(CHILD(n, end - 1)) == SEMI)
27444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            end--;
27454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* loop by 2 to skip semi-colons */
27464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < end; i += 2) {
27474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(n, i);
27484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s = ast_for_stmt(c, ch);
27494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!s)
27504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
27514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(seq, pos++, s);
27524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
27554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 2; i < (NCH(n) - 1); i++) {
27564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ch = CHILD(n, i);
27574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            REQ(ch, stmt);
27584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            num = num_stmts(ch);
27594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (num == 1) {
27604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* small_stmt or compound_stmt with only one child */
27614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = ast_for_stmt(c, ch);
27624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (!s)
27634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
27644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                asdl_seq_SET(seq, pos++, s);
27654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
27664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else {
27674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                int j;
27684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ch = CHILD(ch, 0);
27694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                REQ(ch, simple_stmt);
27704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (j = 0; j < NCH(ch); j += 2) {
27714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    /* statement terminates with a semi-colon ';' */
27724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (NCH(CHILD(ch, j)) == 0) {
27734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        assert((j + 1) == NCH(ch));
27744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        break;
27754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    }
27764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    s = ast_for_stmt(c, CHILD(ch, j));
27774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if (!s)
27784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
27794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    asdl_seq_SET(seq, pos++, s);
27804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
27814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
27824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
27834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
27844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(pos == seq->size);
27854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return seq;
27864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
27874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
27894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_if_stmt(struct compiling *c, const node *n)
27904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
27914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
27924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       ['else' ':' suite]
27934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
27944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    char *s;
27954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, if_stmt);
27974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
27984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 4) {
27994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
28004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq;
28014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 1));
28034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
28044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_seq = ast_for_suite(c, CHILD(n, 3));
28064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
28074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
28104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  c->c_arena);
28114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = STR(CHILD(n, 4));
28144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* s[2], the third character in the string, will be
28154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       's' for el_s_e, or
28164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       'i' for el_i_f
28174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    */
28184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (s[2] == 's') {
28194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
28204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *seq1, *seq2;
28214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 1));
28234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
28244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq1 = ast_for_suite(c, CHILD(n, 3));
28264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq1)
28274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq2 = ast_for_suite(c, CHILD(n, 6));
28294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq2)
28304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
28334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  c->c_arena);
28344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
28354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (s[2] == 'i') {
28364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i, n_elif, has_else = 0;
28374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
28384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq;
28394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *orelse = NULL;
28404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n_elif = NCH(n) - 4;
28414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* must reference the child n_elif+1 since 'else' token is third,
28424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           not fourth, child from the end. */
28434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (TYPE(CHILD(n, (n_elif + 1))) == NAME
28444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
28454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            has_else = 1;
28464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_elif -= 3;
28474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
28484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n_elif /= 4;
28494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (has_else) {
28514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *suite_seq2;
28524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            orelse = asdl_seq_new(1, c->c_arena);
28544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!orelse)
28554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
28574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!expression)
28584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
28604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!suite_seq)
28614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
28634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!suite_seq2)
28644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(orelse, 0,
28674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         If(expression, suite_seq, suite_seq2,
28684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            LINENO(CHILD(n, NCH(n) - 6)),
28694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            CHILD(n, NCH(n) - 6)->n_col_offset,
28704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            c->c_arena));
28714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* the just-created orelse handled the last elif */
28724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_elif--;
28734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
28744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < n_elif; i++) {
28764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            int off = 5 + (n_elif - i - 1) * 4;
28774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq *newobj = asdl_seq_new(1, c->c_arena);
28784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!newobj)
28794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            expression = ast_for_expr(c, CHILD(n, off));
28814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!expression)
28824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite_seq = ast_for_suite(c, CHILD(n, off + 2));
28844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!suite_seq)
28854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
28864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
28874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(newobj, 0,
28884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         If(expression, suite_seq, orelse,
28894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            LINENO(CHILD(n, off)),
28904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            CHILD(n, off)->n_col_offset, c->c_arena));
28914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            orelse = newobj;
28924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
28934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 1));
28944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
28954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_seq = ast_for_suite(c, CHILD(n, 3));
28974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
28984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
28994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return If(expression, suite_seq, orelse,
29004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  LINENO(n), n->n_col_offset, c->c_arena);
29014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError,
29044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "unexpected token in 'if' statement: %s", s);
29054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
29064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
29094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_while_stmt(struct compiling *c, const node *n)
29104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
29124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, while_stmt);
29134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 4) {
29154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
29164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq;
29174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 1));
29194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
29204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_seq = ast_for_suite(c, CHILD(n, 3));
29224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
29234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
29254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     c->c_arena);
29264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(n) == 7) {
29284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
29294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *seq1, *seq2;
29304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(n, 1));
29324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
29334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq1 = ast_for_suite(c, CHILD(n, 3));
29354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq1)
29364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq2 = ast_for_suite(c, CHILD(n, 6));
29384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq2)
29394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return While(expression, seq1, seq2, LINENO(n), n->n_col_offset,
29424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     c->c_arena);
29434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError,
29464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "wrong number of tokens for 'while' statement: %d",
29474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NCH(n));
29484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
29494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
29524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_for_stmt(struct compiling *c, const node *n)
29534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *_target, *seq = NULL, *suite_seq;
29554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty expression;
29564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty target, first;
29574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const node *node_target;
29584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
29594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, for_stmt);
29604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 9) {
29624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        seq = ast_for_suite(c, CHILD(n, 8));
29634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!seq)
29644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
29654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
29664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    node_target = CHILD(n, 1);
29684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    _target = ast_for_exprlist(c, node_target, Store);
29694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!_target)
29704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* Check the # of children rather than the length of _target, since
29724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm       for x, in ... has 1 element in _target, but still requires a Tuple. */
29734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    first = (expr_ty)asdl_seq_GET(_target, 0);
29744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(node_target) == 1)
29754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        target = first;
29764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else
29774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
29784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expression = ast_for_testlist(c, CHILD(n, 3));
29804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!expression)
29814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite_seq = ast_for_suite(c, CHILD(n, 5));
29834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!suite_seq)
29844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
29854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset,
29874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               c->c_arena);
29884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
29894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic excepthandler_ty
29914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_except_clause(struct compiling *c, const node *exc, node *body)
29924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
29934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* except_clause: 'except' [test [(',' | 'as') test]] */
29944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(exc, except_clause);
29954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(body, suite);
29964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
29974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(exc) == 1) {
29984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq = ast_for_suite(c, body);
29994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
30004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
30034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             exc->n_col_offset, c->c_arena);
30044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(exc) == 2) {
30064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
30074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq;
30084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(exc, 1));
30104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
30114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_seq = ast_for_suite(c, body);
30134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
30144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
30174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             exc->n_col_offset, c->c_arena);
30184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (NCH(exc) == 4) {
30204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *suite_seq;
30214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty expression;
30224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expr_ty e = ast_for_expr(c, CHILD(exc, 3));
30234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!e)
30244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!set_context(c, e, Store, CHILD(exc, 3)))
30264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expression = ast_for_expr(c, CHILD(exc, 1));
30284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!expression)
30294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_seq = ast_for_suite(c, body);
30314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!suite_seq)
30324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ExceptHandler(expression, e, suite_seq, LINENO(exc),
30354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             exc->n_col_offset, c->c_arena);
30364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyErr_Format(PyExc_SystemError,
30394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "wrong number of children for 'except' clause: %d",
30404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NCH(exc));
30414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return NULL;
30424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
30434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
30454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_try_stmt(struct compiling *c, const node *n)
30464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
30474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    const int nch = NCH(n);
30484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int n_except = (nch - 3)/3;
30494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *body, *orelse = NULL, *finally = NULL;
30504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, try_stmt);
30524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    body = ast_for_suite(c, CHILD(n, 2));
30544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (body == NULL)
30554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n, nch - 3)) == NAME) {
30584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
30594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
30604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* we can assume it's an "else",
30614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   because nch >= 9 for try-else-finally and
30624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   it would otherwise have a type of except_clause */
30634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                orelse = ast_for_suite(c, CHILD(n, nch - 4));
30644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (orelse == NULL)
30654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return NULL;
30664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n_except--;
30674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            }
30684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally = ast_for_suite(c, CHILD(n, nch - 1));
30704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (finally == NULL)
30714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
30724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_except--;
30734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
30744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else {
30754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            /* we can assume it's an "else",
30764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               otherwise it would have a type of except_clause */
30774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            orelse = ast_for_suite(c, CHILD(n, nch - 1));
30784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (orelse == NULL)
30794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
30804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n_except--;
30814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
30824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
30844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ast_error(n, "malformed 'try' statement");
30854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
30864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
30874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (n_except > 0) {
30894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
30904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        stmt_ty except_st;
30914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* process except statements to create a try ... except */
30924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
30934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (handlers == NULL)
30944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
30954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
30964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for (i = 0; i < n_except; i++) {
30974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
30984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                       CHILD(n, 5 + i * 3));
30994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if (!e)
31004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
31014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            asdl_seq_SET(handlers, i, e);
31024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
31034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except_st = TryExcept(body, handlers, orelse, LINENO(n),
31054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              n->n_col_offset, c->c_arena);
31064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!finally)
31074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return except_st;
31084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* if a 'finally' is present too, we nest the TryExcept within a
31104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm           TryFinally to emulate try ... except ... finally */
31114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        body = asdl_seq_new(1, c->c_arena);
31124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (body == NULL)
31134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(body, 0, except_st);
31154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* must be a try ... finally (except clauses are in body, if any exist) */
31184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    assert(finally != NULL);
31194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
31204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* with_item: test ['as' expr] */
31234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
31244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
31254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    expr_ty context_expr, optional_vars = NULL;
31274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, with_item);
31294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    context_expr = ast_for_expr(c, CHILD(n, 0));
31304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!context_expr)
31314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
31324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 3) {
31334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        optional_vars = ast_for_expr(c, CHILD(n, 2));
31344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!optional_vars) {
31364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
31384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!set_context(c, optional_vars, Store, n)) {
31394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
31414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return With(context_expr, optional_vars, content, LINENO(n),
31444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n->n_col_offset, c->c_arena);
31454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
31484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
31494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_with_stmt(struct compiling *c, const node *n)
31504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    int i;
31524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    stmt_ty ret;
31534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *inner;
31544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, with_stmt);
31564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* process the with items inside-out */
31584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    i = NCH(n) - 1;
31594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* the suite of the innermost with item is the suite of the with stmt */
31604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    inner = ast_for_suite(c, CHILD(n, i));
31614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!inner)
31624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
31634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for (;;) {
31654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i -= 2;
31664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ret = ast_for_with_item(c, CHILD(n, i), inner);
31674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!ret)
31684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* was this the last item? */
31704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (i == 1)
31714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            break;
31724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* if not, wrap the result so far in a new sequence */
31734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inner = asdl_seq_new(1, c->c_arena);
31744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!inner)
31754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        asdl_seq_SET(inner, 0, ret);
31774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
31784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ret;
31804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
31814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
31834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
31844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
31854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
31864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    PyObject *classname;
31874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    asdl_seq *bases, *s;
31884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    REQ(n, classdef);
31904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!forbidden_check(c, n, STR(CHILD(n, 1))))
31924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
31944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (NCH(n) == 4) {
31954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = ast_for_suite(c, CHILD(n, 3));
31964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!s)
31974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
31984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        classname = NEW_IDENTIFIER(CHILD(n, 1));
31994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!classname)
32004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
32014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
32024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        n->n_col_offset, c->c_arena);
32034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* check for empty base list */
32054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(CHILD(n,3)) == RPAR) {
32064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = ast_for_suite(c, CHILD(n,5));
32074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!s)
32084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
32094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        classname = NEW_IDENTIFIER(CHILD(n, 1));
32104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (!classname)
32114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return NULL;
32124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ClassDef(classname, NULL, s, decorator_seq, LINENO(n),
32134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        n->n_col_offset, c->c_arena);
32144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    /* else handle the base class list */
32174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    bases = ast_for_class_bases(c, CHILD(n, 3));
32184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!bases)
32194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    s = ast_for_suite(c, CHILD(n, 6));
32224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!s)
32234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    classname = NEW_IDENTIFIER(CHILD(n, 1));
32254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (!classname)
32264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
32274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return ClassDef(classname, bases, s, decorator_seq,
32284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    LINENO(n), n->n_col_offset, c->c_arena);
32294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
32304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
32314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic stmt_ty
32324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmast_for_stmt(struct compiling *c, const node *n)
32334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
32344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == stmt) {
32354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(NCH(n) == 1);
32364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
32374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == simple_stmt) {
32394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(num_stmts(n) == 1);
32404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
32414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if (TYPE(n) == small_stmt) {
32434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = CHILD(n, 0);
32444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* small_stmt: expr_stmt | print_stmt  | del_stmt | pass_stmt
32454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     | flow_stmt | import_stmt | global_stmt | exec_stmt
32464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     | assert_stmt
32474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
32484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(n)) {
32494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case expr_stmt:
32504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_expr_stmt(c, n);
32514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case print_stmt:
32524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_print_stmt(c, n);
32534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case del_stmt:
32544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_del_stmt(c, n);
32554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case pass_stmt:
32564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return Pass(LINENO(n), n->n_col_offset, c->c_arena);
32574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case flow_stmt:
32584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_flow_stmt(c, n);
32594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case import_stmt:
32604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_import_stmt(c, n);
32614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case global_stmt:
32624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_global_stmt(c, n);
32634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case exec_stmt:
32644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_exec_stmt(c, n);
32654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case assert_stmt:
32664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_assert_stmt(c, n);
32674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
32684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_SystemError,
32694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "unhandled small_stmt: TYPE=%d NCH=%d\n",
32704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             TYPE(n), NCH(n));
32714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
32724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
32734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
32744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else {
32754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
32764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        | funcdef | classdef | decorated
32774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        */
32784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        node *ch = CHILD(n, 0);
32794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(n, compound_stmt);
32804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        switch (TYPE(ch)) {
32814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case if_stmt:
32824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_if_stmt(c, ch);
32834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case while_stmt:
32844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_while_stmt(c, ch);
32854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case for_stmt:
32864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_for_stmt(c, ch);
32874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case try_stmt:
32884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_try_stmt(c, ch);
32894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case with_stmt:
32904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_with_stmt(c, ch);
32914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case funcdef:
32924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_funcdef(c, ch, NULL);
32934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            case classdef:
32944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ast_for_classdef(c, ch, NULL);
32954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm	    case decorated:
32964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm	        return ast_for_decorated(c, ch);
32974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            default:
32984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_Format(PyExc_SystemError,
32994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             "unhandled small_stmt: TYPE=%d NCH=%d\n",
33004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             TYPE(n), NCH(n));
33014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
33024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
33034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    }
33044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
33074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparsenumber(struct compiling *c, const char *s)
33084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const char *end;
33104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        long x;
33114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        double dx;
33124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef WITHOUT_COMPLEX
33134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_complex complex;
33144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int imflag;
33154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert(s != NULL);
33184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        errno = 0;
33194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        end = s + strlen(s) - 1;
33204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef WITHOUT_COMPLEX
33214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        imflag = *end == 'j' || *end == 'J';
33224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*end == 'l' || *end == 'L')
33244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyLong_FromString((char *)s, (char **)0, 0);
33254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = PyOS_strtol((char *)s, (char **)&end, 0);
33264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (*end == '\0') {
33274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (errno != 0)
33284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return PyLong_FromString((char *)s, (char **)0, 0);
33294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyInt_FromLong(x);
33304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
33314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* XXX Huge floats may silently fail */
33324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef WITHOUT_COMPLEX
33334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (imflag) {
33344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                complex.real = 0.;
33354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                complex.imag = PyOS_string_to_double(s, (char **)&end, NULL);
33364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (complex.imag == -1.0 && PyErr_Occurred())
33374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
33384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyComplex_FromCComplex(complex);
33394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
33404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
33414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        {
33434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                dx = PyOS_string_to_double(s, NULL, NULL);
33444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (dx == -1.0 && PyErr_Occurred())
33454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
33464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return PyFloat_FromDouble(dx);
33474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
33484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
33514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdecode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
33524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_USING_UNICODE
33544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_FatalError("decode_utf8 should not be called in this build.");
33554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
33564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
33574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *u, *v;
33584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *s, *t;
33594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        t = s = (char *)*sPtr;
33604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
33614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while (s < end && (*s & 0x80)) s++;
33624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        *sPtr = s;
33634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u = PyUnicode_DecodeUTF8(t, s - t, NULL);
33644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (u == NULL)
33654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
33664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = PyUnicode_AsEncodedString(u, encoding, NULL);
33674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_DECREF(u);
33684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return v;
33694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
33704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
33714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
33724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
33734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
33744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdecode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
33754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
33764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v;
33774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *u = NULL;
33784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *buf;
33794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        char *p;
33804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        const char *end;
33814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (encoding != NULL && strcmp(encoding, "iso-8859-1")) {
33824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* check for integer overflow */
33834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (len > PY_SIZE_MAX / 6)
33844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
33854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm		/* "<C3><A4>" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
33864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm		   "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
33874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                u = PyString_FromStringAndSize((char *)NULL, len * 6);
33884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (u == NULL)
33894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
33904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                p = buf = PyString_AsString(u);
33914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                end = s + len;
33924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while (s < end) {
33934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (*s == '\\') {
33944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                *p++ = *s++;
33954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                if (*s & 0x80) {
33964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        strcpy(p, "u005c");
33974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        p += 5;
33984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                }
33994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
34004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (*s & 0x80) { /* XXX inefficient */
34014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyObject *w;
34024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                char *r;
34034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_ssize_t rn, i;
34044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                w = decode_utf8(c, &s, end, "utf-32-be");
34054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                if (w == NULL) {
34064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        Py_DECREF(u);
34074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        return NULL;
34084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                }
34094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                r = PyString_AsString(w);
34104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                rn = PyString_Size(w);
34114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                assert(rn % 4 == 0);
34124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                for (i = 0; i < rn; i += 4) {
34134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        sprintf(p, "\\U%02x%02x%02x%02x",
34144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                r[i + 0] & 0xFF,
34154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                r[i + 1] & 0xFF,
34164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm						r[i + 2] & 0xFF,
34174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm						r[i + 3] & 0xFF);
34184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                        p += 10;
34194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                }
34204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_DECREF(w);
34214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        } else {
34224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                *p++ = *s++;
34234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
34244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
34254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len = p - buf;
34264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s = buf;
34274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (rawmode)
34294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL);
34304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else
34314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                v = PyUnicode_DecodeUnicodeEscape(s, len, NULL);
34324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(u);
34334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return v;
34344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
34354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* s is a Python string literal, including the bracketing quote characters,
34384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * and r &/or u prefixes (if any), and embedded escape sequences (if any).
34394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * parsestr parses it, and returns the decoded Python string object.
34404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
34414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
34424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparsestr(struct compiling *c, const char *s)
34434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
34444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        size_t len;
34454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int quote = Py_CHARMASK(*s);
34464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int rawmode = 0;
34474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int need_encoding;
34484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int unicode = c->c_future_unicode;
34494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (isalpha(quote) || quote == '_') {
34514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (quote == 'u' || quote == 'U') {
34524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        quote = *++s;
34534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        unicode = 1;
34544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
34554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (quote == 'b' || quote == 'B') {
34564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        quote = *++s;
34574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        unicode = 0;
34584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
34594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (quote == 'r' || quote == 'R') {
34604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        quote = *++s;
34614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        rawmode = 1;
34624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
34634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (quote != '\'' && quote != '\"') {
34654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_BadInternalCall();
34664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
34674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s++;
34694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        len = strlen(s);
34704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (len > INT_MAX) {
34714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_SetString(PyExc_OverflowError,
34724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                "string to parse is too long");
34734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
34744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (s[--len] != quote) {
34764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                PyErr_BadInternalCall();
34774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return NULL;
34784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (len >= 4 && s[0] == quote && s[1] == quote) {
34804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s += 2;
34814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                len -= 2;
34824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (s[--len] != quote || s[--len] != quote) {
34834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyErr_BadInternalCall();
34844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return NULL;
34854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
34864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
34884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (unicode || Py_UnicodeFlag) {
34894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return decode_unicode(c, s, len, rawmode, c->c_encoding);
34904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
34914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
34924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        need_encoding = (c->c_encoding != NULL &&
34934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         strcmp(c->c_encoding, "utf-8") != 0 &&
34944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         strcmp(c->c_encoding, "iso-8859-1") != 0);
34954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (rawmode || strchr(s, '\\') == NULL) {
34964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (need_encoding) {
34974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_USING_UNICODE
34984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        /* This should not happen - we never see any other
34994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                           encoding. */
35004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_FatalError(
35014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                            "cannot deal with encodings in this build.");
35024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else
35034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
35044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (u == NULL)
35054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                return NULL;
35064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
35074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        Py_DECREF(u);
35084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return v;
35094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
35104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                } else {
35114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        return PyString_FromStringAndSize(s, len);
35124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
35134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
35144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return PyString_DecodeEscape(s, len, NULL, unicode,
35164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                     need_encoding ? c->c_encoding : NULL);
35174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
35184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Build a Python string object out of a STRING atom.  This takes care of
35204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * compile-time literal catenation, calling parsestr() on each piece, and
35214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * pasting the intermediate results together.
35224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */
35234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *
35244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparsestrplus(struct compiling *c, const node *n)
35254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{
35264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        PyObject *v;
35274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int i;
35284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        REQ(CHILD(n, 0), STRING);
35294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
35304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                /* String literal concatenation */
35314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (i = 1; i < NCH(n); i++) {
35324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        PyObject *s;
35334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        s = parsestr(c, STR(CHILD(n, i)));
35344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (s == NULL)
35354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                goto onError;
35364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        if (PyString_Check(v) && PyString_Check(s)) {
35374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyString_ConcatAndDel(&v, s);
35384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                if (v == NULL)
35394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    goto onError;
35404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
35414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE
35424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        else {
35434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                PyObject *temp = PyUnicode_Concat(v, s);
35444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_DECREF(s);
35454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                Py_DECREF(v);
35464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                v = temp;
35474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                if (v == NULL)
35484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    goto onError;
35494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        }
35504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif
35514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                }
35524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        }
35534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return v;
35544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
35554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm onError:
35564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Py_XDECREF(v);
35574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return NULL;
35584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
3559