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