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