Mercurial > cpython-lru_cache-weakref
annotate Python/ast.c @ 56959:032d9749047d 2.6
Merged revisions 75931 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r75931 | benjamin.peterson | 2009-10-28 20:49:07 -0500 (Wed, 28 Oct 2009) | 5 lines
do a backport of r75928
The added test does not fail without the patch, but we still fix the issue of
surrogates being used in wide builds where they should not be.
........
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Thu, 29 Oct 2009 02:02:47 +0000 |
| parents | 20a1ccaddcae |
| children | f9f3950b5ec7 |
| rev | line source |
|---|---|
| 35742 | 1 /* |
| 2 * This file includes functions to transform a concrete syntax tree (CST) to | |
| 3 * an abstract syntax tree (AST). The main function is PyAST_FromNode(). | |
| 4 * | |
| 5 */ | |
| 6 #include "Python.h" | |
| 7 #include "Python-ast.h" | |
| 8 #include "grammar.h" | |
| 9 #include "node.h" | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
10 #include "pyarena.h" |
| 35742 | 11 #include "ast.h" |
| 12 #include "token.h" | |
| 13 #include "parsetok.h" | |
| 14 #include "graminit.h" | |
| 15 | |
| 16 #include <assert.h> | |
| 17 | |
| 18 /* Data structure used internally */ | |
| 19 struct compiling { | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
20 char *c_encoding; /* source encoding */ |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
21 int c_future_unicode; /* __future__ unicode literals flag */ |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
22 PyArena *c_arena; /* arena for allocating memeory */ |
|
43997
17479a09ec7c
Added filename to compiling struct based on Martin's suggestion.
Christian Heimes <christian@cheimes.de>
parents:
43985
diff
changeset
|
23 const char *c_filename; /* filename */ |
| 35742 | 24 }; |
| 25 | |
| 26 static asdl_seq *seq_for_testlist(struct compiling *, const node *); | |
| 27 static expr_ty ast_for_expr(struct compiling *, const node *); | |
| 28 static stmt_ty ast_for_stmt(struct compiling *, const node *); | |
| 29 static asdl_seq *ast_for_suite(struct compiling *, const node *); | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
30 static asdl_seq *ast_for_exprlist(struct compiling *, const node *, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
31 expr_context_ty); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
32 static expr_ty ast_for_testlist(struct compiling *, const node *); |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
33 static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
34 static expr_ty ast_for_testlist_gexp(struct compiling *, const node *); |
| 35742 | 35 |
| 36 /* Note different signature for ast_for_call */ | |
| 37 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty); | |
| 38 | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
39 static PyObject *parsenumber(struct compiling *, const char *); |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
40 static PyObject *parsestr(struct compiling *, const char *); |
| 35742 | 41 static PyObject *parsestrplus(struct compiling *, const node *n); |
| 42 | |
| 43 #ifndef LINENO | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
44 #define LINENO(n) ((n)->n_lineno) |
| 35742 | 45 #endif |
| 46 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
47 static identifier |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
48 new_identifier(const char* n, PyArena *arena) { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
49 PyObject* id = PyString_InternFromString(n); |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
50 if (id != NULL) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
51 PyArena_AddPyObject(arena, id); |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
52 return id; |
| 35742 | 53 } |
| 54 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
55 #define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena) |
| 35742 | 56 |
| 57 /* This routine provides an invalid object for the syntax error. | |
| 58 The outermost routine must unpack this error and create the | |
| 59 proper object. We do this so that we don't have to pass | |
| 60 the filename to everything function. | |
| 61 | |
| 62 XXX Maybe we should just pass the filename... | |
| 63 */ | |
| 64 | |
| 65 static int | |
| 66 ast_error(const node *n, const char *errstr) | |
| 67 { | |
| 68 PyObject *u = Py_BuildValue("zi", errstr, LINENO(n)); | |
| 69 if (!u) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
70 return 0; |
| 35742 | 71 PyErr_SetObject(PyExc_SyntaxError, u); |
| 72 Py_DECREF(u); | |
| 73 return 0; | |
| 74 } | |
| 75 | |
| 76 static void | |
| 77 ast_error_finish(const char *filename) | |
| 78 { | |
| 79 PyObject *type, *value, *tback, *errstr, *loc, *tmp; | |
|
36231
d3f4c467e439
Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents:
36224
diff
changeset
|
80 long lineno; |
| 35742 | 81 |
| 82 assert(PyErr_Occurred()); | |
| 83 if (!PyErr_ExceptionMatches(PyExc_SyntaxError)) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
84 return; |
| 35742 | 85 |
| 86 PyErr_Fetch(&type, &value, &tback); | |
| 87 errstr = PyTuple_GetItem(value, 0); | |
| 88 if (!errstr) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
89 return; |
| 35742 | 90 Py_INCREF(errstr); |
| 91 lineno = PyInt_AsLong(PyTuple_GetItem(value, 1)); | |
|
36000
cc3261597136
SF #1370197, memory leak - ast_error_finish (in error conditions).
Neal Norwitz <nnorwitz@gmail.com>
parents:
35990
diff
changeset
|
92 if (lineno == -1) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
93 Py_DECREF(errstr); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
94 return; |
|
36000
cc3261597136
SF #1370197, memory leak - ast_error_finish (in error conditions).
Neal Norwitz <nnorwitz@gmail.com>
parents:
35990
diff
changeset
|
95 } |
| 35742 | 96 Py_DECREF(value); |
| 97 | |
| 98 loc = PyErr_ProgramText(filename, lineno); | |
| 99 if (!loc) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
100 Py_INCREF(Py_None); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
101 loc = Py_None; |
| 35742 | 102 } |
|
36231
d3f4c467e439
Fix icc warnings: conversion from "long" to "int" may lose significant bits
Neal Norwitz <nnorwitz@gmail.com>
parents:
36224
diff
changeset
|
103 tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc); |
| 35742 | 104 Py_DECREF(loc); |
|
36000
cc3261597136
SF #1370197, memory leak - ast_error_finish (in error conditions).
Neal Norwitz <nnorwitz@gmail.com>
parents:
35990
diff
changeset
|
105 if (!tmp) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
106 Py_DECREF(errstr); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
107 return; |
|
36000
cc3261597136
SF #1370197, memory leak - ast_error_finish (in error conditions).
Neal Norwitz <nnorwitz@gmail.com>
parents:
35990
diff
changeset
|
108 } |
|
38406
8f7c7aeac3a5
Replace Py_BuildValue("OO") by PyTuple_Pack.
Georg Brandl <georg@python.org>
parents:
38218
diff
changeset
|
109 value = PyTuple_Pack(2, errstr, tmp); |
| 35742 | 110 Py_DECREF(errstr); |
| 111 Py_DECREF(tmp); | |
| 112 if (!value) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
113 return; |
| 35742 | 114 PyErr_Restore(type, value, tback); |
| 115 } | |
| 116 | |
|
47521
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
117 static int |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
118 ast_warn(struct compiling *c, const node *n, char *msg) |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
119 { |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
120 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, LINENO(n), |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
121 NULL, NULL) < 0) { |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
122 /* if -Werr, change it to a SyntaxError */ |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
123 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SyntaxWarning)) |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
124 ast_error(n, msg); |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
125 return 0; |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
126 } |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
127 return 1; |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
128 } |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
129 |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
130 static int |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
131 forbidden_check(struct compiling *c, const node *n, const char *x) |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
132 { |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
133 if (!strcmp(x, "None")) |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
134 return ast_error(n, "assignment to None"); |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
135 if (Py_Py3kWarningFlag && !(strcmp(x, "True") && strcmp(x, "False")) && |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
136 !ast_warn(c, n, "assignment to True or False is forbidden in 3.x")) |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
137 return 0; |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
138 return 1; |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
139 } |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
140 |
| 35742 | 141 /* num_stmts() returns number of contained statements. |
| 142 | |
| 143 Use this routine to determine how big a sequence is needed for | |
| 144 the statements in a parse tree. Its raison d'etre is this bit of | |
| 145 grammar: | |
| 146 | |
| 147 stmt: simple_stmt | compound_stmt | |
| 148 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE | |
| 149 | |
| 150 A simple_stmt can contain multiple small_stmt elements joined | |
| 151 by semicolons. If the arg is a simple_stmt, the number of | |
| 152 small_stmt elements is returned. | |
| 153 */ | |
| 154 | |
| 155 static int | |
| 156 num_stmts(const node *n) | |
| 157 { | |
| 158 int i, l; | |
| 159 node *ch; | |
| 160 | |
| 161 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
162 case single_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
163 if (TYPE(CHILD(n, 0)) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
164 return 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
165 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
166 return num_stmts(CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
167 case file_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
168 l = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
169 for (i = 0; i < NCH(n); i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
170 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
171 if (TYPE(ch) == stmt) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
172 l += num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
173 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
174 return l; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
175 case stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
176 return num_stmts(CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
177 case compound_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
178 return 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
179 case simple_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
180 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
181 case suite: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
182 if (NCH(n) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
183 return num_stmts(CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
184 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
185 l = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
186 for (i = 2; i < (NCH(n) - 1); i++) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
187 l += num_stmts(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
188 return l; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
189 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
190 default: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
191 char buf[128]; |
| 35742 | 192 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
193 sprintf(buf, "Non-statement found: %d %d\n", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
194 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
195 Py_FatalError(buf); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
196 } |
| 35742 | 197 } |
| 198 assert(0); | |
| 199 return 0; | |
| 200 } | |
| 201 | |
| 202 /* Transform the CST rooted at node * to the appropriate AST | |
| 203 */ | |
| 204 | |
| 205 mod_ty | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
206 PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
207 PyArena *arena) |
| 35742 | 208 { |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
209 int i, j, k, num; |
| 35742 | 210 asdl_seq *stmts = NULL; |
| 211 stmt_ty s; | |
| 212 node *ch; | |
| 213 struct compiling c; | |
| 214 | |
| 215 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
216 c.c_encoding = "utf-8"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
217 if (TYPE(n) == encoding_decl) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
218 ast_error(n, "encoding declaration in Unicode string"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
219 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
220 } |
| 35742 | 221 } else if (TYPE(n) == encoding_decl) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
222 c.c_encoding = STR(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
223 n = CHILD(n, 0); |
| 35742 | 224 } else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
225 c.c_encoding = NULL; |
| 35742 | 226 } |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
227 c.c_future_unicode = flags && flags->cf_flags & CO_FUTURE_UNICODE_LITERALS; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
228 c.c_arena = arena; |
|
43997
17479a09ec7c
Added filename to compiling struct based on Martin's suggestion.
Christian Heimes <christian@cheimes.de>
parents:
43985
diff
changeset
|
229 c.c_filename = filename; |
| 35742 | 230 |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
231 k = 0; |
| 35742 | 232 switch (TYPE(n)) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
233 case file_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
234 stmts = asdl_seq_new(num_stmts(n), arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
235 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
236 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
237 for (i = 0; i < NCH(n) - 1; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
238 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
239 if (TYPE(ch) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
240 continue; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
241 REQ(ch, stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
242 num = num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
243 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
244 s = ast_for_stmt(&c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
245 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
246 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
247 asdl_seq_SET(stmts, k++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
248 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
249 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
250 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
251 REQ(ch, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
252 for (j = 0; j < num; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
253 s = ast_for_stmt(&c, CHILD(ch, j * 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
254 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
255 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
256 asdl_seq_SET(stmts, k++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
257 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
258 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
259 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
260 return Module(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
261 case eval_input: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
262 expr_ty testlist_ast; |
| 35742 | 263 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
264 /* XXX Why not gen_for here? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
265 testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
266 if (!testlist_ast) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
267 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
268 return Expression(testlist_ast, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
269 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
270 case single_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
271 if (TYPE(CHILD(n, 0)) == NEWLINE) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
272 stmts = asdl_seq_new(1, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
273 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
274 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
275 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
276 arena)); |
|
41579
7a4f174df844
Handle a couple of uncaught errors. This should be backported
Neal Norwitz <nnorwitz@gmail.com>
parents:
41578
diff
changeset
|
277 if (!asdl_seq_GET(stmts, 0)) |
|
7a4f174df844
Handle a couple of uncaught errors. This should be backported
Neal Norwitz <nnorwitz@gmail.com>
parents:
41578
diff
changeset
|
278 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
279 return Interactive(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
280 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
281 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
282 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
283 num = num_stmts(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
284 stmts = asdl_seq_new(num, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
285 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
286 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
287 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
288 s = ast_for_stmt(&c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
289 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
290 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
291 asdl_seq_SET(stmts, 0, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
292 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
293 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
294 /* Only a simple_stmt can contain multiple statements. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
295 REQ(n, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
296 for (i = 0; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
297 if (TYPE(CHILD(n, i)) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
298 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
299 s = ast_for_stmt(&c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
300 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
301 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
302 asdl_seq_SET(stmts, i / 2, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
303 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
304 } |
| 35742 | 305 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
306 return Interactive(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
307 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
308 default: |
|
41578
bc6a0fe32351
Actually raise an exception before calling ast_error_finish.
Georg Brandl <georg@python.org>
parents:
41215
diff
changeset
|
309 PyErr_Format(PyExc_SystemError, |
|
bc6a0fe32351
Actually raise an exception before calling ast_error_finish.
Georg Brandl <georg@python.org>
parents:
41215
diff
changeset
|
310 "invalid node %d for PyAST_FromNode", TYPE(n)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
311 goto error; |
| 35742 | 312 } |
| 313 error: | |
| 314 ast_error_finish(filename); | |
| 315 return NULL; | |
| 316 } | |
| 317 | |
| 318 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) | |
| 319 */ | |
| 320 | |
| 321 static operator_ty | |
| 322 get_operator(const node *n) | |
| 323 { | |
| 324 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
325 case VBAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
326 return BitOr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
327 case CIRCUMFLEX: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
328 return BitXor; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
329 case AMPER: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
330 return BitAnd; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
331 case LEFTSHIFT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
332 return LShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
333 case RIGHTSHIFT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
334 return RShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
335 case PLUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
336 return Add; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
337 case MINUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
338 return Sub; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
339 case STAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
340 return Mult; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
341 case SLASH: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
342 return Div; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
343 case DOUBLESLASH: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
344 return FloorDiv; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
345 case PERCENT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
346 return Mod; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
347 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
348 return (operator_ty)0; |
| 35742 | 349 } |
| 350 } | |
| 351 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
352 /* Set the context ctx for expr_ty e, recursively traversing e. |
| 35742 | 353 |
| 354 Only sets context for expr kinds that "can appear in assignment context" | |
| 355 (according to ../Parser/Python.asdl). For other expr kinds, it sets | |
| 356 an appropriate syntax error and returns false. | |
| 357 */ | |
| 358 | |
| 359 static int | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
360 set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) |
| 35742 | 361 { |
| 362 asdl_seq *s = NULL; | |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
363 /* If a particular expression type can't be used for assign / delete, |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
364 set expr_name to its name and an error message will be generated. |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
365 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
366 const char* expr_name = NULL; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
367 |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
368 /* The ast defines augmented store and load contexts, but the |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
369 implementation here doesn't actually use them. The code may be |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
370 a little more complex than necessary as a result. It also means |
|
39037
9f70f6ba7b69
Fix AST compiler bug #1501934: incorrect LOAD/STORE_GLOBAL generation.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39034
diff
changeset
|
371 that expressions in an augmented assignment have a Store context. |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
372 Consider restructuring so that augmented assignment uses |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
373 set_context(), too. |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
374 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
375 assert(ctx != AugStore && ctx != AugLoad); |
| 35742 | 376 |
| 377 switch (e->kind) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
378 case Attribute_kind: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
379 if (ctx == Store && !forbidden_check(c, n, |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
380 PyBytes_AS_STRING(e->v.Attribute.attr))) |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
381 return 0; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
382 e->v.Attribute.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
383 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
384 case Subscript_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
385 e->v.Subscript.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
386 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
387 case Name_kind: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
388 if (ctx == Store && !forbidden_check(c, n, |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
389 PyBytes_AS_STRING(e->v.Name.id))) |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
390 return 0; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
391 e->v.Name.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
392 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
393 case List_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
394 e->v.List.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
395 s = e->v.List.elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
396 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
397 case Tuple_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
398 if (asdl_seq_LEN(e->v.Tuple.elts) == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
399 return ast_error(n, "can't assign to ()"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
400 e->v.Tuple.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
401 s = e->v.Tuple.elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
402 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
403 case Lambda_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
404 expr_name = "lambda"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
405 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
406 case Call_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
407 expr_name = "function call"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
408 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
409 case BoolOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
410 case BinOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
411 case UnaryOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
412 expr_name = "operator"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
413 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
414 case GeneratorExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
415 expr_name = "generator expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
416 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
417 case Yield_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
418 expr_name = "yield expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
419 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
420 case ListComp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
421 expr_name = "list comprehension"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
422 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
423 case Dict_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
424 case Num_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
425 case Str_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
426 expr_name = "literal"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
427 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
428 case Compare_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
429 expr_name = "comparison"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
430 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
431 case Repr_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
432 expr_name = "repr"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
433 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
434 case IfExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
435 expr_name = "conditional expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
436 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
437 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
438 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
439 "unexpected expression in assignment %d (line %d)", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
440 e->kind, e->lineno); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
441 return 0; |
| 35742 | 442 } |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
443 /* Check for error string set by switch */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
444 if (expr_name) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
445 char buf[300]; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
446 PyOS_snprintf(buf, sizeof(buf), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
447 "can't %s %s", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
448 ctx == Store ? "assign to" : "delete", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
449 expr_name); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
450 return ast_error(n, buf); |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
451 } |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
452 |
| 35742 | 453 /* If the LHS is a list or tuple, we need to set the assignment |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
454 context for all the contained elements. |
| 35742 | 455 */ |
| 456 if (s) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
457 int i; |
| 35742 | 458 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
459 for (i = 0; i < asdl_seq_LEN(s); i++) { |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
460 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n)) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
461 return 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
462 } |
| 35742 | 463 } |
| 464 return 1; | |
| 465 } | |
| 466 | |
| 467 static operator_ty | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
468 ast_for_augassign(struct compiling *c, const node *n) |
| 35742 | 469 { |
| 470 REQ(n, augassign); | |
| 471 n = CHILD(n, 0); | |
| 472 switch (STR(n)[0]) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
473 case '+': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
474 return Add; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
475 case '-': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
476 return Sub; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
477 case '/': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
478 if (STR(n)[1] == '/') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
479 return FloorDiv; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
480 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
481 return Div; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
482 case '%': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
483 return Mod; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
484 case '<': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
485 return LShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
486 case '>': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
487 return RShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
488 case '&': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
489 return BitAnd; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
490 case '^': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
491 return BitXor; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
492 case '|': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
493 return BitOr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
494 case '*': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
495 if (STR(n)[1] == '*') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
496 return Pow; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
497 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
498 return Mult; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
499 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
500 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
501 return (operator_ty)0; |
| 35742 | 502 } |
| 503 } | |
| 504 | |
| 505 static cmpop_ty | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
506 ast_for_comp_op(struct compiling *c, const node *n) |
| 35742 | 507 { |
| 508 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is' | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
509 |'is' 'not' |
| 35742 | 510 */ |
| 511 REQ(n, comp_op); | |
| 512 if (NCH(n) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
513 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
514 switch (TYPE(n)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
515 case LESS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
516 return Lt; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
517 case GREATER: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
518 return Gt; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
519 case EQEQUAL: /* == */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
520 return Eq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
521 case LESSEQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
522 return LtE; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
523 case GREATEREQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
524 return GtE; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
525 case NOTEQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
526 return NotEq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
527 case NAME: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
528 if (strcmp(STR(n), "in") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
529 return In; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
530 if (strcmp(STR(n), "is") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
531 return Is; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
532 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
533 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
534 STR(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
535 return (cmpop_ty)0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
536 } |
| 35742 | 537 } |
| 538 else if (NCH(n) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
539 /* handle "not in" and "is not" */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
540 switch (TYPE(CHILD(n, 0))) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
541 case NAME: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
542 if (strcmp(STR(CHILD(n, 1)), "in") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
543 return NotIn; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
544 if (strcmp(STR(CHILD(n, 0)), "is") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
545 return IsNot; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
546 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
547 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
548 STR(CHILD(n, 0)), STR(CHILD(n, 1))); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
549 return (cmpop_ty)0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
550 } |
| 35742 | 551 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
552 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children", |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
553 NCH(n)); |
|
37604
c732f66c913f
Convert 0 to their respective enum types. Convert
Martin v. Löwis <martin@v.loewis.de>
parents:
37597
diff
changeset
|
554 return (cmpop_ty)0; |
| 35742 | 555 } |
| 556 | |
| 557 static asdl_seq * | |
| 558 seq_for_testlist(struct compiling *c, const node *n) | |
| 559 { | |
| 560 /* testlist: test (',' test)* [','] */ | |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
561 asdl_seq *seq; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
562 expr_ty expression; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
563 int i; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
564 assert(TYPE(n) == testlist || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
565 TYPE(n) == listmaker || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
566 TYPE(n) == testlist_gexp || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
567 TYPE(n) == testlist_safe || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
568 TYPE(n) == testlist1); |
| 35742 | 569 |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
570 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 571 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
572 return NULL; |
| 35742 | 573 |
| 574 for (i = 0; i < NCH(n); i += 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
575 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test); |
| 35742 | 576 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
577 expression = ast_for_expr(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
578 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
579 return NULL; |
| 35742 | 580 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
581 assert(i / 2 < seq->size); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
582 asdl_seq_SET(seq, i / 2, expression); |
| 35742 | 583 } |
| 584 return seq; | |
| 585 } | |
| 586 | |
| 587 static expr_ty | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
588 compiler_complex_args(struct compiling *c, const node *n) |
| 35742 | 589 { |
| 590 int i, len = (NCH(n) + 1) / 2; | |
| 591 expr_ty result; | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
592 asdl_seq *args = asdl_seq_new(len, c->c_arena); |
| 35742 | 593 if (!args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
594 return NULL; |
| 35742 | 595 |
|
39872
b8cb7201379c
Bug #1557232: fix seg fault with def f((((x)))) and def f(((x),)).
Neal Norwitz <nnorwitz@gmail.com>
parents:
39779
diff
changeset
|
596 /* fpdef: NAME | '(' fplist ')' |
|
b8cb7201379c
Bug #1557232: fix seg fault with def f((((x)))) and def f(((x),)).
Neal Norwitz <nnorwitz@gmail.com>
parents:
39779
diff
changeset
|
597 fplist: fpdef (',' fpdef)* [','] |
|
b8cb7201379c
Bug #1557232: fix seg fault with def f((((x)))) and def f(((x),)).
Neal Norwitz <nnorwitz@gmail.com>
parents:
39779
diff
changeset
|
598 */ |
| 35742 | 599 REQ(n, fplist); |
| 600 for (i = 0; i < len; i++) { | |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
601 PyObject *arg_id; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
602 const node *fpdef_node = CHILD(n, 2*i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
603 const node *child; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
604 expr_ty arg; |
|
39872
b8cb7201379c
Bug #1557232: fix seg fault with def f((((x)))) and def f(((x),)).
Neal Norwitz <nnorwitz@gmail.com>
parents:
39779
diff
changeset
|
605 set_name: |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
606 /* fpdef_node is either a NAME or an fplist */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
607 child = CHILD(fpdef_node, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
608 if (TYPE(child) == NAME) { |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
609 if (!forbidden_check(c, n, STR(child))) |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
610 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
611 arg_id = NEW_IDENTIFIER(child); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
612 if (!arg_id) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
613 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
614 arg = Name(arg_id, Store, LINENO(child), child->n_col_offset, |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
615 c->c_arena); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
616 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
617 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
618 assert(TYPE(fpdef_node) == fpdef); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
619 /* fpdef_node[0] is not a name, so it must be '(', get CHILD[1] */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
620 child = CHILD(fpdef_node, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
621 assert(TYPE(child) == fplist); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
622 /* NCH == 1 means we have (x), we need to elide the extra parens */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
623 if (NCH(child) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
624 fpdef_node = CHILD(child, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
625 assert(TYPE(fpdef_node) == fpdef); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
626 goto set_name; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
627 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
628 arg = compiler_complex_args(c, child); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
629 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
630 asdl_seq_SET(args, i, arg); |
| 35742 | 631 } |
| 632 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
633 result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena); |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
634 if (!set_context(c, result, Store, n)) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
635 return NULL; |
| 35742 | 636 return result; |
| 637 } | |
| 638 | |
| 639 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
640 /* Create AST for argument list. */ |
| 35742 | 641 |
| 642 static arguments_ty | |
| 643 ast_for_arguments(struct compiling *c, const node *n) | |
| 644 { | |
| 645 /* parameters: '(' [varargslist] ')' | |
| 646 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
647 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [','] |
| 35742 | 648 */ |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
649 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0; |
| 35742 | 650 asdl_seq *args, *defaults; |
| 651 identifier vararg = NULL, kwarg = NULL; | |
| 652 node *ch; | |
| 653 | |
| 654 if (TYPE(n) == parameters) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
655 if (NCH(n) == 2) /* () as argument list */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
656 return arguments(NULL, NULL, NULL, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
657 n = CHILD(n, 1); |
| 35742 | 658 } |
| 659 REQ(n, varargslist); | |
| 660 | |
| 661 /* first count the number of normal args & defaults */ | |
| 662 for (i = 0; i < NCH(n); i++) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
663 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
664 if (TYPE(ch) == fpdef) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
665 n_args++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
666 if (TYPE(ch) == EQUAL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
667 n_defaults++; |
| 35742 | 668 } |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
669 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL); |
| 35742 | 670 if (!args && n_args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
671 return NULL; /* Don't need to goto error; no objects allocated */ |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
672 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL); |
| 35742 | 673 if (!defaults && n_defaults) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
674 return NULL; /* Don't need to goto error; no objects allocated */ |
| 35742 | 675 |
| 676 /* fpdef: NAME | '(' fplist ')' | |
| 677 fplist: fpdef (',' fpdef)* [','] | |
| 678 */ | |
| 679 i = 0; | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
680 j = 0; /* index for defaults */ |
|
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
681 k = 0; /* index for args */ |
| 35742 | 682 while (i < NCH(n)) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
683 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
684 switch (TYPE(ch)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
685 case fpdef: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
686 handle_fpdef: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
687 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
688 anything other than EQUAL or a comma? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
689 /* XXX Should NCH(n) check be made a separate check? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
690 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
691 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
692 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
693 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
694 assert(defaults != NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
695 asdl_seq_SET(defaults, j++, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
696 i += 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
697 found_default = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
698 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
699 else if (found_default) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
700 ast_error(n, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
701 "non-default argument follows default argument"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
702 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
703 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
704 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
705 ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
706 /* def foo((x)): is not complex, special case. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
707 if (NCH(ch) != 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
708 /* We have complex arguments, setup for unpacking. */ |
|
47524
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
709 if (Py_Py3kWarningFlag && !ast_warn(c, ch, |
|
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
710 "tuple parameter unpacking has been removed in 3.x")) |
|
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
711 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
712 asdl_seq_SET(args, k++, compiler_complex_args(c, ch)); |
|
41579
7a4f174df844
Handle a couple of uncaught errors. This should be backported
Neal Norwitz <nnorwitz@gmail.com>
parents:
41578
diff
changeset
|
713 if (!asdl_seq_GET(args, k-1)) |
|
7a4f174df844
Handle a couple of uncaught errors. This should be backported
Neal Norwitz <nnorwitz@gmail.com>
parents:
41578
diff
changeset
|
714 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
715 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
716 /* def foo((x)): setup for checking NAME below. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
717 /* Loop because there can be many parens and tuple |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
718 unpacking mixed in. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
719 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
720 assert(TYPE(ch) == fpdef); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
721 goto handle_fpdef; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
722 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
723 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
724 if (TYPE(CHILD(ch, 0)) == NAME) { |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
725 PyObject *id; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
726 expr_ty name; |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
727 if (!forbidden_check(c, n, STR(CHILD(ch, 0)))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
728 goto error; |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
729 id = NEW_IDENTIFIER(CHILD(ch, 0)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
730 if (!id) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
731 goto error; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
732 name = Name(id, Param, LINENO(ch), ch->n_col_offset, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
733 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
734 if (!name) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
735 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
736 asdl_seq_SET(args, k++, name); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
737 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
738 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
739 i += 2; /* the name and the comma */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
740 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
741 case STAR: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
742 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1)))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
743 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
744 vararg = NEW_IDENTIFIER(CHILD(n, i+1)); |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
745 if (!vararg) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
746 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
747 i += 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
748 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
749 case DOUBLESTAR: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
750 if (!forbidden_check(c, CHILD(n, i+1), STR(CHILD(n, i+1)))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
751 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
752 kwarg = NEW_IDENTIFIER(CHILD(n, i+1)); |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
753 if (!kwarg) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
754 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
755 i += 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
756 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
757 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
758 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
759 "unexpected node in varargslist: %d @ %d", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
760 TYPE(ch), i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
761 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
762 } |
| 35742 | 763 } |
| 764 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
765 return arguments(args, vararg, kwarg, defaults, c->c_arena); |
| 35742 | 766 |
| 767 error: | |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
768 Py_XDECREF(vararg); |
|
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
769 Py_XDECREF(kwarg); |
| 35742 | 770 return NULL; |
| 771 } | |
| 772 | |
| 773 static expr_ty | |
| 774 ast_for_dotted_name(struct compiling *c, const node *n) | |
| 775 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
776 expr_ty e; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
777 identifier id; |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
778 int lineno, col_offset; |
| 35742 | 779 int i; |
| 780 | |
| 781 REQ(n, dotted_name); | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
782 |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
783 lineno = LINENO(n); |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
784 col_offset = n->n_col_offset; |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
785 |
| 35742 | 786 id = NEW_IDENTIFIER(CHILD(n, 0)); |
| 787 if (!id) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
788 return NULL; |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
789 e = Name(id, Load, lineno, col_offset, c->c_arena); |
| 35742 | 790 if (!e) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
791 return NULL; |
| 35742 | 792 |
| 793 for (i = 2; i < NCH(n); i+=2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
794 id = NEW_IDENTIFIER(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
795 if (!id) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
796 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
797 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
798 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
799 return NULL; |
| 35742 | 800 } |
| 801 | |
| 802 return e; | |
| 803 } | |
| 804 | |
| 805 static expr_ty | |
| 806 ast_for_decorator(struct compiling *c, const node *n) | |
| 807 { | |
| 808 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ | |
| 809 expr_ty d = NULL; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
810 expr_ty name_expr; |
| 35742 | 811 |
| 812 REQ(n, decorator); | |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
813 REQ(CHILD(n, 0), AT); |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
814 REQ(RCHILD(n, -1), NEWLINE); |
| 35742 | 815 |
| 816 name_expr = ast_for_dotted_name(c, CHILD(n, 1)); | |
| 817 if (!name_expr) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
818 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
819 |
| 35742 | 820 if (NCH(n) == 3) { /* No arguments */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
821 d = name_expr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
822 name_expr = NULL; |
| 35742 | 823 } |
| 824 else if (NCH(n) == 5) { /* Call with no arguments */ | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
825 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
826 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
827 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
828 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
829 name_expr = NULL; |
| 35742 | 830 } |
| 831 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
832 d = ast_for_call(c, CHILD(n, 3), name_expr); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
833 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
834 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
835 name_expr = NULL; |
| 35742 | 836 } |
| 837 | |
| 838 return d; | |
| 839 } | |
| 840 | |
| 841 static asdl_seq* | |
| 842 ast_for_decorators(struct compiling *c, const node *n) | |
| 843 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
844 asdl_seq* decorator_seq; |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
845 expr_ty d; |
| 35742 | 846 int i; |
| 847 | |
| 848 REQ(n, decorators); | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
849 decorator_seq = asdl_seq_new(NCH(n), c->c_arena); |
| 35742 | 850 if (!decorator_seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
851 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
852 |
| 35742 | 853 for (i = 0; i < NCH(n); i++) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
854 d = ast_for_decorator(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
855 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
856 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
857 asdl_seq_SET(decorator_seq, i, d); |
| 35742 | 858 } |
| 859 return decorator_seq; | |
| 860 } | |
| 861 | |
| 862 static stmt_ty | |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
863 ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 864 { |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
865 /* funcdef: 'def' NAME parameters ':' suite */ |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
866 identifier name; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
867 arguments_ty args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
868 asdl_seq *body; |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
869 int name_i = 1; |
| 35742 | 870 |
| 871 REQ(n, funcdef); | |
| 872 | |
| 873 name = NEW_IDENTIFIER(CHILD(n, name_i)); | |
| 874 if (!name) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
875 return NULL; |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
876 else if (!forbidden_check(c, CHILD(n, name_i), STR(CHILD(n, name_i)))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
877 return NULL; |
| 35742 | 878 args = ast_for_arguments(c, CHILD(n, name_i + 1)); |
| 879 if (!args) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
880 return NULL; |
| 35742 | 881 body = ast_for_suite(c, CHILD(n, name_i + 3)); |
| 882 if (!body) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
883 return NULL; |
| 35742 | 884 |
|
37453
16a64e394602
Add lineno, col_offset to excephandler to enable future fix for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
37235
diff
changeset
|
885 return FunctionDef(name, args, body, decorator_seq, LINENO(n), |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
886 n->n_col_offset, c->c_arena); |
| 35742 | 887 } |
| 888 | |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
889 static stmt_ty |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
890 ast_for_decorated(struct compiling *c, const node *n) |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
891 { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
892 /* decorated: decorators (classdef | funcdef) */ |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
893 stmt_ty thing = NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
894 asdl_seq *decorator_seq = NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
895 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
896 REQ(n, decorated); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
897 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
898 decorator_seq = ast_for_decorators(c, CHILD(n, 0)); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
899 if (!decorator_seq) |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
900 return NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
901 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
902 assert(TYPE(CHILD(n, 1)) == funcdef || |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
903 TYPE(CHILD(n, 1)) == classdef); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
904 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
905 if (TYPE(CHILD(n, 1)) == funcdef) { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
906 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
907 } else if (TYPE(CHILD(n, 1)) == classdef) { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
908 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
909 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
910 /* we count the decorators in when talking about the class' or |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
911 function's line number */ |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
912 if (thing) { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
913 thing->lineno = LINENO(n); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
914 thing->col_offset = n->n_col_offset; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
915 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
916 return thing; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
917 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
918 |
| 35742 | 919 static expr_ty |
| 920 ast_for_lambdef(struct compiling *c, const node *n) | |
| 921 { | |
| 922 /* lambdef: 'lambda' [varargslist] ':' test */ | |
| 923 arguments_ty args; | |
| 924 expr_ty expression; | |
| 925 | |
| 926 if (NCH(n) == 3) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
927 args = arguments(NULL, NULL, NULL, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
928 if (!args) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
929 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
930 expression = ast_for_expr(c, CHILD(n, 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
931 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
932 return NULL; |
| 35742 | 933 } |
| 934 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
935 args = ast_for_arguments(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
936 if (!args) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
937 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
938 expression = ast_for_expr(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
939 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
940 return NULL; |
| 35742 | 941 } |
| 942 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
943 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 944 } |
| 945 | |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
946 static expr_ty |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
947 ast_for_ifexpr(struct compiling *c, const node *n) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
948 { |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
949 /* test: or_test 'if' or_test 'else' test */ |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
950 expr_ty expression, body, orelse; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
951 |
|
36676
67c74efad8c2
Fix old not-reading-pep-308-right artifact.
Thomas Wouters <thomas@python.org>
parents:
36670
diff
changeset
|
952 assert(NCH(n) == 5); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
953 body = ast_for_expr(c, CHILD(n, 0)); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
954 if (!body) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
955 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
956 expression = ast_for_expr(c, CHILD(n, 2)); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
957 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
958 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
959 orelse = ast_for_expr(c, CHILD(n, 4)); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
960 if (!orelse) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
961 return NULL; |
|
37453
16a64e394602
Add lineno, col_offset to excephandler to enable future fix for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
37235
diff
changeset
|
962 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
963 c->c_arena); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
964 } |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
965 |
|
39755
c591d9954fb3
Add a comment about some refactoring. (There's probably more that should be done.) I will reformat this file in the next checkin due to the inconsistent tabs/spaces.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39753
diff
changeset
|
966 /* XXX(nnorwitz): the listcomp and genexpr code should be refactored |
|
c591d9954fb3
Add a comment about some refactoring. (There's probably more that should be done.) I will reformat this file in the next checkin due to the inconsistent tabs/spaces.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39753
diff
changeset
|
967 so there is only a single version. Possibly for loops can also re-use |
|
c591d9954fb3
Add a comment about some refactoring. (There's probably more that should be done.) I will reformat this file in the next checkin due to the inconsistent tabs/spaces.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39753
diff
changeset
|
968 the code. |
|
c591d9954fb3
Add a comment about some refactoring. (There's probably more that should be done.) I will reformat this file in the next checkin due to the inconsistent tabs/spaces.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39753
diff
changeset
|
969 */ |
|
c591d9954fb3
Add a comment about some refactoring. (There's probably more that should be done.) I will reformat this file in the next checkin due to the inconsistent tabs/spaces.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39753
diff
changeset
|
970 |
| 35742 | 971 /* Count the number of 'for' loop in a list comprehension. |
| 972 | |
| 973 Helper for ast_for_listcomp(). | |
| 974 */ | |
| 975 | |
| 976 static int | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
977 count_list_fors(struct compiling *c, const node *n) |
| 35742 | 978 { |
| 979 int n_fors = 0; | |
| 980 node *ch = CHILD(n, 1); | |
| 981 | |
| 982 count_list_for: | |
| 983 n_fors++; | |
| 984 REQ(ch, list_for); | |
| 985 if (NCH(ch) == 5) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
986 ch = CHILD(ch, 4); |
| 35742 | 987 else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
988 return n_fors; |
| 35742 | 989 count_list_iter: |
| 990 REQ(ch, list_iter); | |
| 991 ch = CHILD(ch, 0); | |
| 992 if (TYPE(ch) == list_for) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
993 goto count_list_for; |
| 35742 | 994 else if (TYPE(ch) == list_if) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
995 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
996 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
997 goto count_list_iter; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
998 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
999 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1000 return n_fors; |
| 35742 | 1001 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1002 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1003 /* Should never be reached */ |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1004 PyErr_SetString(PyExc_SystemError, "logic error in count_list_fors"); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1005 return -1; |
| 35742 | 1006 } |
| 1007 | |
| 1008 /* Count the number of 'if' statements in a list comprehension. | |
| 1009 | |
| 1010 Helper for ast_for_listcomp(). | |
| 1011 */ | |
| 1012 | |
| 1013 static int | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1014 count_list_ifs(struct compiling *c, const node *n) |
| 35742 | 1015 { |
| 1016 int n_ifs = 0; | |
| 1017 | |
| 1018 count_list_iter: | |
| 1019 REQ(n, list_iter); | |
| 1020 if (TYPE(CHILD(n, 0)) == list_for) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1021 return n_ifs; |
| 35742 | 1022 n = CHILD(n, 0); |
| 1023 REQ(n, list_if); | |
| 1024 n_ifs++; | |
| 1025 if (NCH(n) == 2) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1026 return n_ifs; |
| 35742 | 1027 n = CHILD(n, 2); |
| 1028 goto count_list_iter; | |
| 1029 } | |
| 1030 | |
| 1031 static expr_ty | |
| 1032 ast_for_listcomp(struct compiling *c, const node *n) | |
| 1033 { | |
| 1034 /* listmaker: test ( list_for | (',' test)* [','] ) | |
| 1035 list_for: 'for' exprlist 'in' testlist_safe [list_iter] | |
| 1036 list_iter: list_for | list_if | |
| 1037 list_if: 'if' test [list_iter] | |
| 1038 testlist_safe: test [(',' test)+ [',']] | |
| 1039 */ | |
| 1040 expr_ty elt; | |
| 1041 asdl_seq *listcomps; | |
| 1042 int i, n_fors; | |
| 1043 node *ch; | |
| 1044 | |
| 1045 REQ(n, listmaker); | |
| 1046 assert(NCH(n) > 1); | |
| 1047 | |
| 1048 elt = ast_for_expr(c, CHILD(n, 0)); | |
| 1049 if (!elt) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1050 return NULL; |
| 35742 | 1051 |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1052 n_fors = count_list_fors(c, n); |
| 35742 | 1053 if (n_fors == -1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1054 return NULL; |
| 35742 | 1055 |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1056 listcomps = asdl_seq_new(n_fors, c->c_arena); |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1057 if (!listcomps) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1058 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1059 |
| 35742 | 1060 ch = CHILD(n, 1); |
| 1061 for (i = 0; i < n_fors; i++) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1062 comprehension_ty lc; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1063 asdl_seq *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1064 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1065 node *for_ch; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1066 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1067 REQ(ch, list_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1068 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1069 for_ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1070 t = ast_for_exprlist(c, for_ch, Store); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1071 if (!t) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1072 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1073 expression = ast_for_testlist(c, CHILD(ch, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1074 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1075 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1076 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1077 /* Check the # of children rather than the length of t, since |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1078 [x for x, in ... ] has 1 element in t, but still requires a Tuple. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1079 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1080 if (NCH(for_ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1081 lc = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, NULL, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1082 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1083 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1084 lc = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1085 c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1086 expression, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1087 if (!lc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1088 return NULL; |
| 35742 | 1089 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1090 if (NCH(ch) == 5) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1091 int j, n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1092 asdl_seq *ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1093 expr_ty list_for_expr; |
| 35742 | 1094 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1095 ch = CHILD(ch, 4); |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1096 n_ifs = count_list_ifs(c, ch); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1097 if (n_ifs == -1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1098 return NULL; |
| 35742 | 1099 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1100 ifs = asdl_seq_new(n_ifs, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1101 if (!ifs) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1102 return NULL; |
| 35742 | 1103 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1104 for (j = 0; j < n_ifs; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1105 REQ(ch, list_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1106 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1107 REQ(ch, list_if); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1108 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1109 list_for_expr = ast_for_expr(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1110 if (!list_for_expr) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1111 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1112 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1113 asdl_seq_SET(ifs, j, list_for_expr); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1114 if (NCH(ch) == 3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1115 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1116 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1117 /* on exit, must guarantee that ch is a list_for */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1118 if (TYPE(ch) == list_iter) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1119 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1120 lc->ifs = ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1121 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1122 asdl_seq_SET(listcomps, i, lc); |
| 35742 | 1123 } |
| 1124 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1125 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1126 } |
| 1127 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1128 /* Count the number of 'for' loops in a generator expression. |
| 35742 | 1129 |
| 1130 Helper for ast_for_genexp(). | |
| 1131 */ | |
| 1132 | |
| 1133 static int | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1134 count_gen_fors(struct compiling *c, const node *n) |
| 35742 | 1135 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1136 int n_fors = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1137 node *ch = CHILD(n, 1); |
| 35742 | 1138 |
| 1139 count_gen_for: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1140 n_fors++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1141 REQ(ch, gen_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1142 if (NCH(ch) == 5) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1143 ch = CHILD(ch, 4); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1144 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1145 return n_fors; |
| 35742 | 1146 count_gen_iter: |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1147 REQ(ch, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1148 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1149 if (TYPE(ch) == gen_for) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1150 goto count_gen_for; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1151 else if (TYPE(ch) == gen_if) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1152 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1153 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1154 goto count_gen_iter; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1155 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1156 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1157 return n_fors; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1158 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1159 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1160 /* Should never be reached */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1161 PyErr_SetString(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1162 "logic error in count_gen_fors"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1163 return -1; |
| 35742 | 1164 } |
| 1165 | |
| 1166 /* Count the number of 'if' statements in a generator expression. | |
| 1167 | |
| 1168 Helper for ast_for_genexp(). | |
| 1169 */ | |
| 1170 | |
| 1171 static int | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1172 count_gen_ifs(struct compiling *c, const node *n) |
| 35742 | 1173 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1174 int n_ifs = 0; |
| 35742 | 1175 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1176 while (1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1177 REQ(n, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1178 if (TYPE(CHILD(n, 0)) == gen_for) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1179 return n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1180 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1181 REQ(n, gen_if); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1182 n_ifs++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1183 if (NCH(n) == 2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1184 return n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1185 n = CHILD(n, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1186 } |
| 35742 | 1187 } |
| 1188 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1189 /* TODO(jhylton): Combine with list comprehension code? */ |
| 35742 | 1190 static expr_ty |
| 1191 ast_for_genexp(struct compiling *c, const node *n) | |
| 1192 { | |
| 1193 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1194 argument: [test '='] test [gen_for] # Really [keyword '='] test */ |
| 35742 | 1195 expr_ty elt; |
| 1196 asdl_seq *genexps; | |
| 1197 int i, n_fors; | |
| 1198 node *ch; | |
| 1199 | |
| 1200 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument)); | |
| 1201 assert(NCH(n) > 1); | |
| 1202 | |
| 1203 elt = ast_for_expr(c, CHILD(n, 0)); | |
| 1204 if (!elt) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1205 return NULL; |
| 35742 | 1206 |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1207 n_fors = count_gen_fors(c, n); |
| 35742 | 1208 if (n_fors == -1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1209 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1210 |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1211 genexps = asdl_seq_new(n_fors, c->c_arena); |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1212 if (!genexps) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1213 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1214 |
| 35742 | 1215 ch = CHILD(n, 1); |
| 1216 for (i = 0; i < n_fors; i++) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1217 comprehension_ty ge; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1218 asdl_seq *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1219 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1220 node *for_ch; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1221 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1222 REQ(ch, gen_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1223 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1224 for_ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1225 t = ast_for_exprlist(c, for_ch, Store); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1226 if (!t) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1227 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1228 expression = ast_for_expr(c, CHILD(ch, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1229 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1230 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1231 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1232 /* Check the # of children rather than the length of t, since |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1233 (x for x, in ...) has 1 element in t, but still requires a Tuple. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1234 if (NCH(for_ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1235 ge = comprehension((expr_ty)asdl_seq_GET(t, 0), expression, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1236 NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1237 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1238 ge = comprehension(Tuple(t, Store, LINENO(ch), ch->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1239 c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1240 expression, NULL, c->c_arena); |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1241 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1242 if (!ge) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1243 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1244 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1245 if (NCH(ch) == 5) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1246 int j, n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1247 asdl_seq *ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1248 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1249 ch = CHILD(ch, 4); |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1250 n_ifs = count_gen_ifs(c, ch); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1251 if (n_ifs == -1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1252 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1253 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1254 ifs = asdl_seq_new(n_ifs, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1255 if (!ifs) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1256 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1257 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1258 for (j = 0; j < n_ifs; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1259 REQ(ch, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1260 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1261 REQ(ch, gen_if); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1262 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1263 expression = ast_for_expr(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1264 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1265 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1266 asdl_seq_SET(ifs, j, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1267 if (NCH(ch) == 3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1268 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1269 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1270 /* on exit, must guarantee that ch is a gen_for */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1271 if (TYPE(ch) == gen_iter) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1272 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1273 ge->ifs = ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1274 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1275 asdl_seq_SET(genexps, i, ge); |
| 35742 | 1276 } |
| 1277 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1278 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1279 } |
| 1280 | |
| 1281 static expr_ty | |
| 1282 ast_for_atom(struct compiling *c, const node *n) | |
| 1283 { | |
| 1284 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | |
| 1285 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+ | |
| 1286 */ | |
| 1287 node *ch = CHILD(n, 0); | |
| 1288 | |
| 1289 switch (TYPE(ch)) { | |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1290 case NAME: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1291 /* All names start in Load context, but may later be |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1292 changed. */ |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1293 PyObject *name = NEW_IDENTIFIER(ch); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1294 if (!name) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1295 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1296 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1297 } |
| 35742 | 1298 case STRING: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1299 PyObject *str = parsestrplus(c, n); |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1300 if (!str) { |
|
44572
db5e01c33eb7
Make Python compile with --disable-unicode.
Georg Brandl <georg@python.org>
parents:
43997
diff
changeset
|
1301 #ifdef Py_USING_UNICODE |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1302 if (PyErr_ExceptionMatches(PyExc_UnicodeError)){ |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1303 PyObject *type, *value, *tback, *errstr; |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1304 PyErr_Fetch(&type, &value, &tback); |
|
49796
0bcafa64eccb
Merged revisions 67320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
1305 errstr = PyObject_Str(value); |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1306 if (errstr) { |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1307 char *s = ""; |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1308 char buf[128]; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
1309 s = PyString_AsString(errstr); |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1310 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s); |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1311 ast_error(n, buf); |
|
49796
0bcafa64eccb
Merged revisions 67320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
1312 Py_DECREF(errstr); |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1313 } else { |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1314 ast_error(n, "(unicode error) unknown error"); |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1315 } |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1316 Py_DECREF(type); |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1317 Py_DECREF(value); |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1318 Py_XDECREF(tback); |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1319 } |
|
44572
db5e01c33eb7
Make Python compile with --disable-unicode.
Georg Brandl <georg@python.org>
parents:
43997
diff
changeset
|
1320 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1321 return NULL; |
|
42308
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1322 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1323 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1324 return Str(str, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1325 } |
| 1326 case NUMBER: { | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1327 PyObject *pynum = parsenumber(c, STR(ch)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1328 if (!pynum) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1329 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1330 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1331 PyArena_AddPyObject(c->c_arena, pynum); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1332 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1333 } |
| 1334 case LPAR: /* some parenthesized expressions */ | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1335 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1336 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1337 if (TYPE(ch) == RPAR) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1338 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1339 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1340 if (TYPE(ch) == yield_expr) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1341 return ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1342 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1343 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == gen_for)) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1344 return ast_for_genexp(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1345 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1346 return ast_for_testlist_gexp(c, ch); |
| 35742 | 1347 case LSQB: /* list (or list comprehension) */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1348 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1349 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1350 if (TYPE(ch) == RSQB) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1351 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1352 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1353 REQ(ch, listmaker); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1354 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1355 asdl_seq *elts = seq_for_testlist(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1356 if (!elts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1357 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1358 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1359 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1360 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1361 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1362 return ast_for_listcomp(c, ch); |
| 35742 | 1363 case LBRACE: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1364 /* dictmaker: test ':' test (',' test ':' test)* [','] */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1365 int i, size; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1366 asdl_seq *keys, *values; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1367 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1368 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1369 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1370 keys = asdl_seq_new(size, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1371 if (!keys) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1372 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1373 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1374 values = asdl_seq_new(size, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1375 if (!values) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1376 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1377 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1378 for (i = 0; i < NCH(ch); i += 4) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1379 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1380 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1381 expression = ast_for_expr(c, CHILD(ch, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1382 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1383 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1384 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1385 asdl_seq_SET(keys, i / 4, expression); |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1386 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1387 expression = ast_for_expr(c, CHILD(ch, i + 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1388 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1389 return NULL; |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
1390 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1391 asdl_seq_SET(values, i / 4, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1392 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1393 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1394 } |
| 1395 case BACKQUOTE: { /* repr */ | |
|
43985
2230f16e402b
And yet another fix for the patch. Paul Moore has send me a note that I've missed a declaration. The additional code has moved the declaration in the middle of the block.
Christian Heimes <christian@cheimes.de>
parents:
43984
diff
changeset
|
1396 expr_ty expression; |
|
47521
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
1397 if (Py_Py3kWarningFlag && |
|
31aee67019a2
add an ast_warn helper function to make adding those Py3k warnings easier
Benjamin Peterson <benjamin@python.org>
parents:
47516
diff
changeset
|
1398 !ast_warn(c, n, "backquote not supported in 3.x; use repr()")) |
|
43985
2230f16e402b
And yet another fix for the patch. Paul Moore has send me a note that I've missed a declaration. The additional code has moved the declaration in the middle of the block.
Christian Heimes <christian@cheimes.de>
parents:
43984
diff
changeset
|
1399 return NULL; |
|
2230f16e402b
And yet another fix for the patch. Paul Moore has send me a note that I've missed a declaration. The additional code has moved the declaration in the middle of the block.
Christian Heimes <christian@cheimes.de>
parents:
43984
diff
changeset
|
1400 expression = ast_for_testlist(c, CHILD(n, 1)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1401 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1402 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1403 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1404 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1405 } |
| 1406 default: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1407 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1408 return NULL; |
| 35742 | 1409 } |
| 1410 } | |
| 1411 | |
| 1412 static slice_ty | |
| 1413 ast_for_slice(struct compiling *c, const node *n) | |
| 1414 { | |
| 1415 node *ch; | |
| 1416 expr_ty lower = NULL, upper = NULL, step = NULL; | |
| 1417 | |
| 1418 REQ(n, subscript); | |
| 1419 | |
| 1420 /* | |
| 1421 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] | |
| 1422 sliceop: ':' [test] | |
| 1423 */ | |
| 1424 ch = CHILD(n, 0); | |
| 1425 if (TYPE(ch) == DOT) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1426 return Ellipsis(c->c_arena); |
| 35742 | 1427 |
| 1428 if (NCH(n) == 1 && TYPE(ch) == test) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1429 /* 'step' variable hold no significance in terms of being used over |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1430 other vars */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1431 step = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1432 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1433 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1434 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1435 return Index(step, c->c_arena); |
| 35742 | 1436 } |
| 1437 | |
| 1438 if (TYPE(ch) == test) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1439 lower = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1440 if (!lower) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1441 return NULL; |
| 35742 | 1442 } |
| 1443 | |
| 1444 /* If there's an upper bound it's in the second or third position. */ | |
| 1445 if (TYPE(ch) == COLON) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1446 if (NCH(n) > 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1447 node *n2 = CHILD(n, 1); |
| 35742 | 1448 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1449 if (TYPE(n2) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1450 upper = ast_for_expr(c, n2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1451 if (!upper) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1452 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1453 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1454 } |
| 35742 | 1455 } else if (NCH(n) > 2) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1456 node *n2 = CHILD(n, 2); |
| 35742 | 1457 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1458 if (TYPE(n2) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1459 upper = ast_for_expr(c, n2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1460 if (!upper) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1461 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1462 } |
| 35742 | 1463 } |
| 1464 | |
| 1465 ch = CHILD(n, NCH(n) - 1); | |
| 1466 if (TYPE(ch) == sliceop) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1467 if (NCH(ch) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1468 /* No expression, so step is None */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1469 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1470 step = Name(new_identifier("None", c->c_arena), Load, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1471 LINENO(ch), ch->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1472 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1473 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1474 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1475 ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1476 if (TYPE(ch) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1477 step = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1478 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1479 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1480 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1481 } |
| 35742 | 1482 } |
| 1483 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1484 return Slice(lower, upper, step, c->c_arena); |
| 35742 | 1485 } |
| 1486 | |
| 1487 static expr_ty | |
| 1488 ast_for_binop(struct compiling *c, const node *n) | |
| 1489 { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1490 /* Must account for a sequence of expressions. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1491 How should A op B op C by represented? |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1492 BinOp(BinOp(A, op, B), op, C). |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1493 */ |
| 35742 | 1494 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1495 int i, nops; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1496 expr_ty expr1, expr2, result; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1497 operator_ty newoperator; |
| 35742 | 1498 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1499 expr1 = ast_for_expr(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1500 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1501 return NULL; |
| 35742 | 1502 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1503 expr2 = ast_for_expr(c, CHILD(n, 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1504 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1505 return NULL; |
| 35742 | 1506 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1507 newoperator = get_operator(CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1508 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1509 return NULL; |
| 35742 | 1510 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1511 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1512 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1513 if (!result) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1514 return NULL; |
| 35742 | 1515 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1516 nops = (NCH(n) - 1) / 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1517 for (i = 1; i < nops; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1518 expr_ty tmp_result, tmp; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1519 const node* next_oper = CHILD(n, i * 2 + 1); |
| 35742 | 1520 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1521 newoperator = get_operator(next_oper); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1522 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1523 return NULL; |
| 35742 | 1524 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1525 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1526 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1527 return NULL; |
| 35742 | 1528 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1529 tmp_result = BinOp(result, newoperator, tmp, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1530 LINENO(next_oper), next_oper->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1531 c->c_arena); |
|
43470
995677219a65
Fix Coverity #158: Check the correct variable.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42459
diff
changeset
|
1532 if (!tmp_result) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1533 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1534 result = tmp_result; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1535 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1536 return result; |
| 35742 | 1537 } |
| 1538 | |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1539 static expr_ty |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1540 ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1541 { |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1542 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1543 subscriptlist: subscript (',' subscript)* [','] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1544 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1545 */ |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1546 REQ(n, trailer); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1547 if (TYPE(CHILD(n, 0)) == LPAR) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1548 if (NCH(n) == 2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1549 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1550 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1551 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1552 return ast_for_call(c, CHILD(n, 1), left_expr); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1553 } |
|
36679
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
1554 else if (TYPE(CHILD(n, 0)) == DOT ) { |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1555 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1556 if (!attr_id) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1557 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
1558 return Attribute(left_expr, attr_id, Load, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1559 LINENO(n), n->n_col_offset, c->c_arena); |
|
36679
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
1560 } |
|
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
1561 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1562 REQ(CHILD(n, 0), LSQB); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1563 REQ(CHILD(n, 2), RSQB); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1564 n = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1565 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1566 slice_ty slc = ast_for_slice(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1567 if (!slc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1568 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1569 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1570 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1571 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1572 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1573 /* The grammar is ambiguous here. The ambiguity is resolved |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1574 by treating the sequence as a tuple literal if there are |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1575 no slice features. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1576 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1577 int j; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1578 slice_ty slc; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1579 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1580 bool simple = true; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1581 asdl_seq *slices, *elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1582 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1583 if (!slices) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1584 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1585 for (j = 0; j < NCH(n); j += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1586 slc = ast_for_slice(c, CHILD(n, j)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1587 if (!slc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1588 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1589 if (slc->kind != Index_kind) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1590 simple = false; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1591 asdl_seq_SET(slices, j / 2, slc); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1592 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1593 if (!simple) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1594 return Subscript(left_expr, ExtSlice(slices, c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1595 Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1596 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1597 /* extract Index values and put them in a Tuple */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1598 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1599 if (!elts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1600 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1601 for (j = 0; j < asdl_seq_LEN(slices); ++j) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1602 slc = (slice_ty)asdl_seq_GET(slices, j); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1603 assert(slc->kind == Index_kind && slc->v.Index.value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1604 asdl_seq_SET(elts, j, slc->v.Index.value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1605 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1606 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1607 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1608 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1609 return Subscript(left_expr, Index(e, c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1610 Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1611 } |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1612 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1613 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1614 |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1615 static expr_ty |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1616 ast_for_factor(struct compiling *c, const node *n) |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1617 { |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1618 node *pfactor, *ppower, *patom, *pnum; |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1619 expr_ty expression; |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1620 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1621 /* If the unary - operator is applied to a constant, don't generate |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1622 a UNARY_NEGATIVE opcode. Just store the approriate value as a |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1623 constant. The peephole optimizer already does something like |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1624 this but it doesn't handle the case where the constant is |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1625 (sys.maxint - 1). In that case, we want a PyIntObject, not a |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1626 PyLongObject. |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1627 */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1628 if (TYPE(CHILD(n, 0)) == MINUS && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1629 NCH(n) == 2 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1630 TYPE((pfactor = CHILD(n, 1))) == factor && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1631 NCH(pfactor) == 1 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1632 TYPE((ppower = CHILD(pfactor, 0))) == power && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1633 NCH(ppower) == 1 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1634 TYPE((patom = CHILD(ppower, 0))) == atom && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1635 TYPE((pnum = CHILD(patom, 0))) == NUMBER) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1636 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1637 if (s == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1638 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1639 s[0] = '-'; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1640 strcpy(s + 1, STR(pnum)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1641 PyObject_FREE(STR(pnum)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1642 STR(pnum) = s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1643 return ast_for_atom(c, patom); |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1644 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1645 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1646 expression = ast_for_expr(c, CHILD(n, 1)); |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1647 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1648 return NULL; |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1649 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1650 switch (TYPE(CHILD(n, 0))) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1651 case PLUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1652 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1653 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1654 case MINUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1655 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1656 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1657 case TILDE: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1658 return UnaryOp(Invert, expression, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1659 n->n_col_offset, c->c_arena); |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1660 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1661 PyErr_Format(PyExc_SystemError, "unhandled factor: %d", |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1662 TYPE(CHILD(n, 0))); |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1663 return NULL; |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1664 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1665 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1666 static expr_ty |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1667 ast_for_power(struct compiling *c, const node *n) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1668 { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1669 /* power: atom trailer* ('**' factor)* |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1670 */ |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1671 int i; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1672 expr_ty e, tmp; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1673 REQ(n, power); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1674 e = ast_for_atom(c, CHILD(n, 0)); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1675 if (!e) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1676 return NULL; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1677 if (NCH(n) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1678 return e; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1679 for (i = 1; i < NCH(n); i++) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1680 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1681 if (TYPE(ch) != trailer) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1682 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1683 tmp = ast_for_trailer(c, ch, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1684 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1685 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1686 tmp->lineno = e->lineno; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1687 tmp->col_offset = e->col_offset; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1688 e = tmp; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1689 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1690 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1691 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1692 if (!f) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1693 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1694 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1695 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1696 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1697 e = tmp; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1698 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1699 return e; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1700 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1701 |
| 35742 | 1702 /* Do not name a variable 'expr'! Will cause a compile error. |
| 1703 */ | |
| 1704 | |
| 1705 static expr_ty | |
| 1706 ast_for_expr(struct compiling *c, const node *n) | |
| 1707 { | |
| 1708 /* handle the full range of simple expressions | |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1709 test: or_test ['if' or_test 'else' test] | lambdef |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1710 or_test: and_test ('or' and_test)* |
| 35742 | 1711 and_test: not_test ('and' not_test)* |
| 1712 not_test: 'not' not_test | comparison | |
| 1713 comparison: expr (comp_op expr)* | |
| 1714 expr: xor_expr ('|' xor_expr)* | |
| 1715 xor_expr: and_expr ('^' and_expr)* | |
| 1716 and_expr: shift_expr ('&' shift_expr)* | |
| 1717 shift_expr: arith_expr (('<<'|'>>') arith_expr)* | |
| 1718 arith_expr: term (('+'|'-') term)* | |
| 1719 term: factor (('*'|'/'|'%'|'//') factor)* | |
| 1720 factor: ('+'|'-'|'~') factor | power | |
| 1721 power: atom trailer* ('**' factor)* | |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1722 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1723 As well as modified versions that exist for backward compatibility, |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1724 to explicitly allow: |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1725 [ x for x in lambda: 0, lambda: 1 ] |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1726 (which would be ambiguous without these extra rules) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1727 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1728 old_test: or_test | old_lambdef |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1729 old_lambdef: 'lambda' [vararglist] ':' old_test |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1730 |
| 35742 | 1731 */ |
| 1732 | |
| 1733 asdl_seq *seq; | |
| 1734 int i; | |
| 1735 | |
| 1736 loop: | |
| 1737 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1738 case test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1739 case old_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1740 if (TYPE(CHILD(n, 0)) == lambdef || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1741 TYPE(CHILD(n, 0)) == old_lambdef) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1742 return ast_for_lambdef(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1743 else if (NCH(n) > 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1744 return ast_for_ifexpr(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1745 /* Fallthrough */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1746 case or_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1747 case and_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1748 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1749 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1750 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1751 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1752 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1753 if (!seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1754 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1755 for (i = 0; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1756 expr_ty e = ast_for_expr(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1757 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1758 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1759 asdl_seq_SET(seq, i / 2, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1760 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1761 if (!strcmp(STR(CHILD(n, 1)), "and")) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1762 return BoolOp(And, seq, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1763 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1764 assert(!strcmp(STR(CHILD(n, 1)), "or")); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1765 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1766 case not_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1767 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1768 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1769 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1770 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1771 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1772 expr_ty expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1773 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1774 return NULL; |
| 35742 | 1775 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1776 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1777 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1778 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1779 case comparison: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1780 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1781 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1782 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1783 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1784 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1785 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1786 asdl_int_seq *ops; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1787 asdl_seq *cmps; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1788 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1789 if (!ops) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1790 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1791 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1792 if (!cmps) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1793 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1794 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1795 for (i = 1; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1796 cmpop_ty newoperator; |
| 35742 | 1797 |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
1798 newoperator = ast_for_comp_op(c, CHILD(n, i)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1799 if (!newoperator) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1800 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1801 } |
| 35742 | 1802 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1803 expression = ast_for_expr(c, CHILD(n, i + 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1804 if (!expression) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1805 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1806 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1807 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1808 asdl_seq_SET(ops, i / 2, newoperator); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1809 asdl_seq_SET(cmps, i / 2, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1810 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1811 expression = ast_for_expr(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1812 if (!expression) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1813 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1814 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1815 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1816 return Compare(expression, ops, cmps, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1817 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1818 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1819 break; |
| 35742 | 1820 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1821 /* The next five cases all handle BinOps. The main body of code |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1822 is the same in each case, but the switch turned inside out to |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1823 reuse the code for each type of operator. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1824 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1825 case expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1826 case xor_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1827 case and_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1828 case shift_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1829 case arith_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1830 case term: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1831 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1832 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1833 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1834 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1835 return ast_for_binop(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1836 case yield_expr: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1837 expr_ty exp = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1838 if (NCH(n) == 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1839 exp = ast_for_testlist(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1840 if (!exp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1841 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1842 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1843 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1844 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1845 case factor: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1846 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1847 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1848 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1849 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1850 return ast_for_factor(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1851 case power: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1852 return ast_for_power(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1853 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1854 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1855 return NULL; |
| 35742 | 1856 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1857 /* should never get here unless if error is set */ |
| 35742 | 1858 return NULL; |
| 1859 } | |
| 1860 | |
| 1861 static expr_ty | |
| 1862 ast_for_call(struct compiling *c, const node *n, expr_ty func) | |
| 1863 { | |
| 1864 /* | |
| 1865 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1866 | '**' test) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1867 argument: [test '='] test [gen_for] # Really [keyword '='] test |
| 35742 | 1868 */ |
| 1869 | |
| 1870 int i, nargs, nkeywords, ngens; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1871 asdl_seq *args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1872 asdl_seq *keywords; |
| 35742 | 1873 expr_ty vararg = NULL, kwarg = NULL; |
| 1874 | |
| 1875 REQ(n, arglist); | |
| 1876 | |
| 1877 nargs = 0; | |
| 1878 nkeywords = 0; | |
| 1879 ngens = 0; | |
| 1880 for (i = 0; i < NCH(n); i++) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1881 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1882 if (TYPE(ch) == argument) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1883 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1884 nargs++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1885 else if (TYPE(CHILD(ch, 1)) == gen_for) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1886 ngens++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1887 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1888 nkeywords++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1889 } |
| 35742 | 1890 } |
| 1891 if (ngens > 1 || (ngens && (nargs || nkeywords))) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1892 ast_error(n, "Generator expression must be parenthesized " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1893 "if not sole argument"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1894 return NULL; |
| 35742 | 1895 } |
| 1896 | |
| 1897 if (nargs + nkeywords + ngens > 255) { | |
| 1898 ast_error(n, "more than 255 arguments"); | |
| 1899 return NULL; | |
| 1900 } | |
| 1901 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1902 args = asdl_seq_new(nargs + ngens, c->c_arena); |
| 35742 | 1903 if (!args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1904 return NULL; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
1905 keywords = asdl_seq_new(nkeywords, c->c_arena); |
| 35742 | 1906 if (!keywords) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1907 return NULL; |
| 35742 | 1908 nargs = 0; |
| 1909 nkeywords = 0; | |
| 1910 for (i = 0; i < NCH(n); i++) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1911 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1912 if (TYPE(ch) == argument) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1913 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1914 if (NCH(ch) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1915 if (nkeywords) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1916 ast_error(CHILD(ch, 0), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1917 "non-keyword arg after keyword arg"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1918 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1919 } |
|
48307
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1920 if (vararg) { |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1921 ast_error(CHILD(ch, 0), |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1922 "only named arguments may follow *expression"); |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1923 return NULL; |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1924 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1925 e = ast_for_expr(c, CHILD(ch, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1926 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1927 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1928 asdl_seq_SET(args, nargs++, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1929 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1930 else if (TYPE(CHILD(ch, 1)) == gen_for) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1931 e = ast_for_genexp(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1932 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1933 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1934 asdl_seq_SET(args, nargs++, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1935 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1936 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1937 keyword_ty kw; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1938 identifier key; |
|
47860
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1939 int k; |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1940 char *tmp; |
| 35742 | 1941 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1942 /* CHILD(ch, 0) is test, but must be an identifier? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1943 e = ast_for_expr(c, CHILD(ch, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1944 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1945 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1946 /* f(lambda x: x[0] = 3) ends up getting parsed with |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1947 * LHS test = lambda x: x[0], and RHS test = 3. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1948 * SF bug 132313 points out that complaining about a keyword |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1949 * then is very confusing. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1950 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1951 if (e->kind == Lambda_kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1952 ast_error(CHILD(ch, 0), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1953 "lambda cannot contain assignment"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1954 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1955 } else if (e->kind != Name_kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1956 ast_error(CHILD(ch, 0), "keyword can't be an expression"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1957 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1958 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1959 key = e->v.Name.id; |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
1960 if (!forbidden_check(c, CHILD(ch, 0), PyBytes_AS_STRING(key))) |
|
41974
c8b0e3b8b456
Disallow function calls like foo(None=1).
Georg Brandl <georg@python.org>
parents:
41773
diff
changeset
|
1961 return NULL; |
|
47860
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1962 for (k = 0; k < nkeywords; k++) { |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1963 tmp = PyString_AS_STRING( |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1964 ((keyword_ty)asdl_seq_GET(keywords, k))->arg); |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1965 if (!strcmp(tmp, PyString_AS_STRING(key))) { |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1966 ast_error(CHILD(ch, 0), "keyword argument repeated"); |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1967 return NULL; |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1968 } |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1969 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1970 e = ast_for_expr(c, CHILD(ch, 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1971 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1972 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1973 kw = keyword(key, e, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1974 if (!kw) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1975 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1976 asdl_seq_SET(keywords, nkeywords++, kw); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1977 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1978 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1979 else if (TYPE(ch) == STAR) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1980 vararg = ast_for_expr(c, CHILD(n, i+1)); |
|
45661
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1981 if (!vararg) |
|
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1982 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1983 i++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1984 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1985 else if (TYPE(ch) == DOUBLESTAR) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1986 kwarg = ast_for_expr(c, CHILD(n, i+1)); |
|
45661
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1987 if (!kwarg) |
|
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1988 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1989 i++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1990 } |
| 35742 | 1991 } |
| 1992 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1993 return Call(func, args, keywords, vararg, kwarg, func->lineno, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1994 func->col_offset, c->c_arena); |
| 35742 | 1995 } |
| 1996 | |
| 1997 static expr_ty | |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
1998 ast_for_testlist(struct compiling *c, const node* n) |
| 35742 | 1999 { |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2000 /* testlist_gexp: test (',' test)* [','] */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2001 /* testlist: test (',' test)* [','] */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2002 /* testlist_safe: test (',' test)+ [','] */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2003 /* testlist1: test (',' test)* */ |
| 35742 | 2004 assert(NCH(n) > 0); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2005 if (TYPE(n) == testlist_gexp) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2006 if (NCH(n) > 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2007 assert(TYPE(CHILD(n, 1)) != gen_for); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2008 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2009 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2010 assert(TYPE(n) == testlist || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2011 TYPE(n) == testlist_safe || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2012 TYPE(n) == testlist1); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2013 } |
| 35742 | 2014 if (NCH(n) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2015 return ast_for_expr(c, CHILD(n, 0)); |
| 35742 | 2016 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2017 asdl_seq *tmp = seq_for_testlist(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2018 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2019 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2020 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2021 } |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2022 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2023 |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2024 static expr_ty |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2025 ast_for_testlist_gexp(struct compiling *c, const node* n) |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2026 { |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2027 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2028 /* argument: test [ gen_for ] */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2029 assert(TYPE(n) == testlist_gexp || TYPE(n) == argument); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2030 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2031 return ast_for_genexp(c, n); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2032 return ast_for_testlist(c, n); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2033 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2034 |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2035 /* like ast_for_testlist() but returns a sequence */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2036 static asdl_seq* |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2037 ast_for_class_bases(struct compiling *c, const node* n) |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2038 { |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2039 /* testlist: test (',' test)* [','] */ |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2040 assert(NCH(n) > 0); |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2041 REQ(n, testlist); |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2042 if (NCH(n) == 1) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2043 expr_ty base; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2044 asdl_seq *bases = asdl_seq_new(1, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2045 if (!bases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2046 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2047 base = ast_for_expr(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2048 if (!base) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2049 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2050 asdl_seq_SET(bases, 0, base); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2051 return bases; |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2052 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2053 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2054 return seq_for_testlist(c, n); |
| 35742 | 2055 } |
| 2056 | |
| 2057 static stmt_ty | |
| 2058 ast_for_expr_stmt(struct compiling *c, const node *n) | |
| 2059 { | |
| 2060 REQ(n, expr_stmt); | |
| 2061 /* expr_stmt: testlist (augassign (yield_expr|testlist) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2062 | ('=' (yield_expr|testlist))*) |
| 35742 | 2063 testlist: test (',' test)* [','] |
| 2064 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2065 | '<<=' | '>>=' | '**=' | '//=' |
| 35742 | 2066 test: ... here starts the operator precendence dance |
| 2067 */ | |
| 2068 | |
| 2069 if (NCH(n) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2070 expr_ty e = ast_for_testlist(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2071 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2072 return NULL; |
| 35742 | 2073 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2074 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2075 } |
| 2076 else if (TYPE(CHILD(n, 1)) == augassign) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2077 expr_ty expr1, expr2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2078 operator_ty newoperator; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2079 node *ch = CHILD(n, 0); |
| 35742 | 2080 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2081 expr1 = ast_for_testlist(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2082 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2083 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2084 /* TODO(nas): Remove duplicated error checks (set_context does it) */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2085 switch (expr1->kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2086 case GeneratorExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2087 ast_error(ch, "augmented assignment to generator " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2088 "expression not possible"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2089 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2090 case Yield_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2091 ast_error(ch, "augmented assignment to yield " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2092 "expression not possible"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2093 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2094 case Name_kind: { |
|
47294
4fe192d48960
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46642
diff
changeset
|
2095 const char *var_name = PyBytes_AS_STRING(expr1->v.Name.id); |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
2096 if ((var_name[0] == 'N' || var_name[0] == 'T' || var_name[0] == 'F') && |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
2097 !forbidden_check(c, ch, var_name)) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2098 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2099 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2100 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2101 case Attribute_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2102 case Subscript_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2103 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2104 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2105 ast_error(ch, "illegal expression for augmented " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2106 "assignment"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2107 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2108 } |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
2109 if(!set_context(c, expr1, Store, ch)) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2110 return NULL; |
| 35742 | 2111 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2112 ch = CHILD(n, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2113 if (TYPE(ch) == testlist) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2114 expr2 = ast_for_testlist(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2115 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2116 expr2 = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2117 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2118 return NULL; |
| 35742 | 2119 |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
2120 newoperator = ast_for_augassign(c, CHILD(n, 1)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2121 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2122 return NULL; |
| 35742 | 2123 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2124 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2125 c->c_arena); |
| 35742 | 2126 } |
| 2127 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2128 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2129 asdl_seq *targets; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2130 node *value; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2131 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2132 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2133 /* a normal assignment */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2134 REQ(CHILD(n, 1), EQUAL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2135 targets = asdl_seq_new(NCH(n) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2136 if (!targets) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2137 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2138 for (i = 0; i < NCH(n) - 2; i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2139 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2140 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2141 if (TYPE(ch) == yield_expr) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2142 ast_error(ch, "assignment to yield expression not possible"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2143 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2144 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2145 e = ast_for_testlist(c, ch); |
| 35742 | 2146 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2147 /* set context to assign */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2148 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2149 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2150 |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
2151 if (!set_context(c, e, Store, CHILD(n, i))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2152 return NULL; |
| 35742 | 2153 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2154 asdl_seq_SET(targets, i / 2, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2155 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2156 value = CHILD(n, NCH(n) - 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2157 if (TYPE(value) == testlist) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2158 expression = ast_for_testlist(c, value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2159 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2160 expression = ast_for_expr(c, value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2161 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2162 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2163 return Assign(targets, expression, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2164 c->c_arena); |
| 35742 | 2165 } |
| 2166 } | |
| 2167 | |
| 2168 static stmt_ty | |
| 2169 ast_for_print_stmt(struct compiling *c, const node *n) | |
| 2170 { | |
| 2171 /* print_stmt: 'print' ( [ test (',' test)* [','] ] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2172 | '>>' test [ (',' test)+ [','] ] ) |
| 35742 | 2173 */ |
| 2174 expr_ty dest = NULL, expression; | |
| 2175 asdl_seq *seq; | |
| 2176 bool nl; | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2177 int i, j, start = 1; |
| 35742 | 2178 |
| 2179 REQ(n, print_stmt); | |
| 2180 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2181 dest = ast_for_expr(c, CHILD(n, 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2182 if (!dest) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2183 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2184 start = 4; |
| 35742 | 2185 } |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2186 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena); |
| 35742 | 2187 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2188 return NULL; |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2189 for (i = start, j = 0; i < NCH(n); i += 2, ++j) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2190 expression = ast_for_expr(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2191 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2192 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2193 asdl_seq_SET(seq, j, expression); |
| 35742 | 2194 } |
| 2195 nl = (TYPE(CHILD(n, NCH(n) - 1)) == COMMA) ? false : true; | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2196 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2197 } |
| 2198 | |
| 2199 static asdl_seq * | |
|
37604
c732f66c913f
Convert 0 to their respective enum types. Convert
Martin v. Löwis <martin@v.loewis.de>
parents:
37597
diff
changeset
|
2200 ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context) |
| 35742 | 2201 { |
| 2202 asdl_seq *seq; | |
| 2203 int i; | |
| 2204 expr_ty e; | |
| 2205 | |
| 2206 REQ(n, exprlist); | |
| 2207 | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2208 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 2209 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2210 return NULL; |
| 35742 | 2211 for (i = 0; i < NCH(n); i += 2) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2212 e = ast_for_expr(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2213 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2214 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2215 asdl_seq_SET(seq, i / 2, e); |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
2216 if (context && !set_context(c, e, context, CHILD(n, i))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2217 return NULL; |
| 35742 | 2218 } |
| 2219 return seq; | |
| 2220 } | |
| 2221 | |
| 2222 static stmt_ty | |
| 2223 ast_for_del_stmt(struct compiling *c, const node *n) | |
| 2224 { | |
| 2225 asdl_seq *expr_list; | |
| 2226 | |
| 2227 /* del_stmt: 'del' exprlist */ | |
| 2228 REQ(n, del_stmt); | |
| 2229 | |
| 2230 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); | |
| 2231 if (!expr_list) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2232 return NULL; |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2233 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2234 } |
| 2235 | |
| 2236 static stmt_ty | |
| 2237 ast_for_flow_stmt(struct compiling *c, const node *n) | |
| 2238 { | |
| 2239 /* | |
| 2240 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2241 | yield_stmt |
| 35742 | 2242 break_stmt: 'break' |
| 2243 continue_stmt: 'continue' | |
| 2244 return_stmt: 'return' [testlist] | |
| 2245 yield_stmt: yield_expr | |
| 2246 yield_expr: 'yield' testlist | |
| 2247 raise_stmt: 'raise' [test [',' test [',' test]]] | |
| 2248 */ | |
| 2249 node *ch; | |
| 2250 | |
| 2251 REQ(n, flow_stmt); | |
| 2252 ch = CHILD(n, 0); | |
| 2253 switch (TYPE(ch)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2254 case break_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2255 return Break(LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2256 case continue_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2257 return Continue(LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2258 case yield_stmt: { /* will reduce to yield_expr */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2259 expr_ty exp = ast_for_expr(c, CHILD(ch, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2260 if (!exp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2261 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2262 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2263 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2264 case return_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2265 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2266 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2267 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2268 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2269 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2270 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2271 return Return(expression, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2272 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2273 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2274 case raise_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2275 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2276 return Raise(NULL, NULL, NULL, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2277 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2278 else if (NCH(ch) == 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2279 expr_ty expression = ast_for_expr(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2280 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2281 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2282 return Raise(expression, NULL, NULL, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2283 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2284 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2285 else if (NCH(ch) == 4) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2286 expr_ty expr1, expr2; |
| 35742 | 2287 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2288 expr1 = ast_for_expr(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2289 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2290 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2291 expr2 = ast_for_expr(c, CHILD(ch, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2292 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2293 return NULL; |
| 35742 | 2294 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2295 return Raise(expr1, expr2, NULL, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2296 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2297 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2298 else if (NCH(ch) == 6) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2299 expr_ty expr1, expr2, expr3; |
| 35742 | 2300 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2301 expr1 = ast_for_expr(c, CHILD(ch, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2302 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2303 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2304 expr2 = ast_for_expr(c, CHILD(ch, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2305 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2306 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2307 expr3 = ast_for_expr(c, CHILD(ch, 5)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2308 if (!expr3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2309 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2310 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2311 return Raise(expr1, expr2, expr3, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2312 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2313 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2314 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2315 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2316 "unexpected flow_stmt: %d", TYPE(ch)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2317 return NULL; |
| 35742 | 2318 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2319 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2320 PyErr_SetString(PyExc_SystemError, "unhandled flow statement"); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2321 return NULL; |
| 35742 | 2322 } |
| 2323 | |
| 2324 static alias_ty | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2325 alias_for_import_name(struct compiling *c, const node *n) |
| 35742 | 2326 { |
| 2327 /* | |
|
36742
658f8ff2a442
Make 'as' an actual keyword when with's future statement is used. Not
Thomas Wouters <thomas@python.org>
parents:
36718
diff
changeset
|
2328 import_as_name: NAME ['as' NAME] |
|
658f8ff2a442
Make 'as' an actual keyword when with's future statement is used. Not
Thomas Wouters <thomas@python.org>
parents:
36718
diff
changeset
|
2329 dotted_as_name: dotted_name ['as' NAME] |
| 35742 | 2330 dotted_name: NAME ('.' NAME)* |
| 2331 */ | |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2332 PyObject *str, *name; |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2333 |
| 35742 | 2334 loop: |
| 2335 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2336 case import_as_name: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2337 str = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2338 if (NCH(n) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2339 str = NEW_IDENTIFIER(CHILD(n, 2)); |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2340 if (!str) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2341 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2342 } |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2343 name = NEW_IDENTIFIER(CHILD(n, 0)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2344 if (!name) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2345 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2346 return alias(name, str, c->c_arena); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2347 case dotted_as_name: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2348 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2349 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2350 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2351 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2352 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2353 alias_ty a = alias_for_import_name(c, CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2354 if (!a) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2355 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2356 assert(!a->asname); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2357 a->asname = NEW_IDENTIFIER(CHILD(n, 2)); |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2358 if (!a->asname) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2359 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2360 return a; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2361 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2362 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2363 case dotted_name: |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2364 if (NCH(n) == 1) { |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2365 name = NEW_IDENTIFIER(CHILD(n, 0)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2366 if (!name) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2367 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2368 return alias(name, NULL, c->c_arena); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
2369 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2370 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2371 /* Create a string of the form "a.b.c" */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2372 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2373 size_t len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2374 char *s; |
| 35742 | 2375 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2376 len = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2377 for (i = 0; i < NCH(n); i += 2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2378 /* length of string plus one for the dot */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2379 len += strlen(STR(CHILD(n, i))) + 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2380 len--; /* the last name doesn't have a dot */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
2381 str = PyString_FromStringAndSize(NULL, len); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2382 if (!str) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2383 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
2384 s = PyString_AS_STRING(str); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2385 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2386 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2387 for (i = 0; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2388 char *sch = STR(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2389 strcpy(s, STR(CHILD(n, i))); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2390 s += strlen(sch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2391 *s++ = '.'; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2392 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2393 --s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2394 *s = '\0'; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
2395 PyString_InternInPlace(&str); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2396 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2397 return alias(str, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2398 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2399 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2400 case STAR: |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
2401 str = PyString_InternFromString("*"); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2402 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2403 return alias(str, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2404 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2405 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2406 "unexpected import name: %d", TYPE(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2407 return NULL; |
| 35742 | 2408 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2409 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2410 PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); |
| 35742 | 2411 return NULL; |
| 2412 } | |
| 2413 | |
| 2414 static stmt_ty | |
| 2415 ast_for_import_stmt(struct compiling *c, const node *n) | |
| 2416 { | |
| 2417 /* | |
| 2418 import_stmt: import_name | import_from | |
| 2419 import_name: 'import' dotted_as_names | |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2420 import_from: 'from' ('.'* dotted_name | '.') 'import' |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2421 ('*' | '(' import_as_names ')' | import_as_names) |
| 35742 | 2422 */ |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2423 int lineno; |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2424 int col_offset; |
| 35742 | 2425 int i; |
| 2426 asdl_seq *aliases; | |
| 2427 | |
| 2428 REQ(n, import_stmt); | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2429 lineno = LINENO(n); |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2430 col_offset = n->n_col_offset; |
| 35742 | 2431 n = CHILD(n, 0); |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2432 if (TYPE(n) == import_name) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2433 n = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2434 REQ(n, dotted_as_names); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2435 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2436 if (!aliases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2437 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2438 for (i = 0; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2439 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2440 if (!import_alias) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2441 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2442 asdl_seq_SET(aliases, i / 2, import_alias); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2443 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2444 return Import(aliases, lineno, col_offset, c->c_arena); |
| 35742 | 2445 } |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2446 else if (TYPE(n) == import_from) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2447 int n_children; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2448 int idx, ndots = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2449 alias_ty mod = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2450 identifier modname; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2451 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2452 /* Count the number of dots (for relative imports) and check for the |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2453 optional module name */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2454 for (idx = 1; idx < NCH(n); idx++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2455 if (TYPE(CHILD(n, idx)) == dotted_name) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2456 mod = alias_for_import_name(c, CHILD(n, idx)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2457 idx++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2458 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2459 } else if (TYPE(CHILD(n, idx)) != DOT) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2460 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2461 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2462 ndots++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2463 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2464 idx++; /* skip over the 'import' keyword */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2465 switch (TYPE(CHILD(n, idx))) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2466 case STAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2467 /* from ... import * */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2468 n = CHILD(n, idx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2469 n_children = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2470 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2471 case LPAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2472 /* from ... import (x, y, z) */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2473 n = CHILD(n, idx + 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2474 n_children = NCH(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2475 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2476 case import_as_names: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2477 /* from ... import x, y, z */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2478 n = CHILD(n, idx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2479 n_children = NCH(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2480 if (n_children % 2 == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2481 ast_error(n, "trailing comma not allowed without" |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2482 " surrounding parentheses"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2483 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2484 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2485 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2486 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2487 ast_error(n, "Unexpected node-type in from-import"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2488 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2489 } |
| 35742 | 2490 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2491 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2492 if (!aliases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2493 return NULL; |
| 35742 | 2494 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2495 /* handle "from ... import *" special b/c there's no children */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2496 if (TYPE(n) == STAR) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2497 alias_ty import_alias = alias_for_import_name(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2498 if (!import_alias) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2499 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2500 asdl_seq_SET(aliases, 0, import_alias); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2501 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2502 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2503 for (i = 0; i < NCH(n); i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2504 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2505 if (!import_alias) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2506 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2507 asdl_seq_SET(aliases, i / 2, import_alias); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2508 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2509 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2510 if (mod != NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2511 modname = mod->name; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2512 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2513 modname = new_identifier("", c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2514 return ImportFrom(modname, aliases, ndots, lineno, col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2515 c->c_arena); |
| 35742 | 2516 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2517 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2518 "unknown import statement: starts with command '%s'", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2519 STR(CHILD(n, 0))); |
| 35742 | 2520 return NULL; |
| 2521 } | |
| 2522 | |
| 2523 static stmt_ty | |
| 2524 ast_for_global_stmt(struct compiling *c, const node *n) | |
| 2525 { | |
| 2526 /* global_stmt: 'global' NAME (',' NAME)* */ | |
| 2527 identifier name; | |
| 2528 asdl_seq *s; | |
| 2529 int i; | |
| 2530 | |
| 2531 REQ(n, global_stmt); | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2532 s = asdl_seq_new(NCH(n) / 2, c->c_arena); |
| 35742 | 2533 if (!s) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2534 return NULL; |
| 35742 | 2535 for (i = 1; i < NCH(n); i += 2) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2536 name = NEW_IDENTIFIER(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2537 if (!name) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2538 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2539 asdl_seq_SET(s, i / 2, name); |
| 35742 | 2540 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2541 return Global(s, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2542 } |
| 2543 | |
| 2544 static stmt_ty | |
| 2545 ast_for_exec_stmt(struct compiling *c, const node *n) | |
| 2546 { | |
| 2547 expr_ty expr1, globals = NULL, locals = NULL; | |
| 2548 int n_children = NCH(n); | |
| 2549 if (n_children != 2 && n_children != 4 && n_children != 6) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2550 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2551 "poorly formed 'exec' statement: %d parts to statement", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2552 n_children); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2553 return NULL; |
| 35742 | 2554 } |
| 2555 | |
| 2556 /* exec_stmt: 'exec' expr ['in' test [',' test]] */ | |
| 2557 REQ(n, exec_stmt); | |
| 2558 expr1 = ast_for_expr(c, CHILD(n, 1)); | |
| 2559 if (!expr1) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2560 return NULL; |
| 35742 | 2561 if (n_children >= 4) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2562 globals = ast_for_expr(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2563 if (!globals) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2564 return NULL; |
| 35742 | 2565 } |
| 2566 if (n_children == 6) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2567 locals = ast_for_expr(c, CHILD(n, 5)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2568 if (!locals) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2569 return NULL; |
| 35742 | 2570 } |
| 2571 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2572 return Exec(expr1, globals, locals, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2573 c->c_arena); |
| 35742 | 2574 } |
| 2575 | |
| 2576 static stmt_ty | |
| 2577 ast_for_assert_stmt(struct compiling *c, const node *n) | |
| 2578 { | |
| 2579 /* assert_stmt: 'assert' test [',' test] */ | |
| 2580 REQ(n, assert_stmt); | |
| 2581 if (NCH(n) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2582 expr_ty expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2583 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2584 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2585 return Assert(expression, NULL, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2586 c->c_arena); |
| 35742 | 2587 } |
| 2588 else if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2589 expr_ty expr1, expr2; |
| 35742 | 2590 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2591 expr1 = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2592 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2593 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2594 expr2 = ast_for_expr(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2595 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2596 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2597 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2598 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2599 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2600 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2601 "improper number of parts to 'assert' statement: %d", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2602 NCH(n)); |
| 35742 | 2603 return NULL; |
| 2604 } | |
| 2605 | |
| 2606 static asdl_seq * | |
| 2607 ast_for_suite(struct compiling *c, const node *n) | |
| 2608 { | |
| 2609 /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */ | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2610 asdl_seq *seq; |
| 35742 | 2611 stmt_ty s; |
| 2612 int i, total, num, end, pos = 0; | |
| 2613 node *ch; | |
| 2614 | |
| 2615 REQ(n, suite); | |
| 2616 | |
| 2617 total = num_stmts(n); | |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
36001
diff
changeset
|
2618 seq = asdl_seq_new(total, c->c_arena); |
| 35742 | 2619 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2620 return NULL; |
| 35742 | 2621 if (TYPE(CHILD(n, 0)) == simple_stmt) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2622 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2623 /* simple_stmt always ends with a NEWLINE, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2624 and may have a trailing SEMI |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2625 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2626 end = NCH(n) - 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2627 if (TYPE(CHILD(n, end - 1)) == SEMI) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2628 end--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2629 /* loop by 2 to skip semi-colons */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2630 for (i = 0; i < end; i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2631 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2632 s = ast_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2633 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2634 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2635 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2636 } |
| 35742 | 2637 } |
| 2638 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2639 for (i = 2; i < (NCH(n) - 1); i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2640 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2641 REQ(ch, stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2642 num = num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2643 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2644 /* small_stmt or compound_stmt with only one child */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2645 s = ast_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2646 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2647 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2648 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2649 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2650 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2651 int j; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2652 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2653 REQ(ch, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2654 for (j = 0; j < NCH(ch); j += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2655 /* statement terminates with a semi-colon ';' */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2656 if (NCH(CHILD(ch, j)) == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2657 assert((j + 1) == NCH(ch)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2658 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2659 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2660 s = ast_for_stmt(c, CHILD(ch, j)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2661 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2662 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2663 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2664 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2665 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2666 } |
| 35742 | 2667 } |
| 2668 assert(pos == seq->size); | |
| 2669 return seq; | |
| 2670 } | |
| 2671 | |
| 2672 static stmt_ty | |
| 2673 ast_for_if_stmt(struct compiling *c, const node *n) | |
| 2674 { | |
| 2675 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)* | |
| 2676 ['else' ':' suite] | |
| 2677 */ | |
| 2678 char *s; | |
| 2679 | |
| 2680 REQ(n, if_stmt); | |
| 2681 | |
| 2682 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2683 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2684 asdl_seq *suite_seq; |
| 35742 | 2685 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2686 expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2687 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2688 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2689 suite_seq = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2690 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2691 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2692 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2693 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2694 c->c_arena); |
| 35742 | 2695 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2696 |
| 35742 | 2697 s = STR(CHILD(n, 4)); |
| 2698 /* s[2], the third character in the string, will be | |
| 2699 's' for el_s_e, or | |
| 2700 'i' for el_i_f | |
| 2701 */ | |
| 2702 if (s[2] == 's') { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2703 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2704 asdl_seq *seq1, *seq2; |
| 35742 | 2705 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2706 expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2707 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2708 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2709 seq1 = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2710 if (!seq1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2711 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2712 seq2 = ast_for_suite(c, CHILD(n, 6)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2713 if (!seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2714 return NULL; |
| 35742 | 2715 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2716 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2717 c->c_arena); |
| 35742 | 2718 } |
| 2719 else if (s[2] == 'i') { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2720 int i, n_elif, has_else = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2721 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2722 asdl_seq *suite_seq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2723 asdl_seq *orelse = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2724 n_elif = NCH(n) - 4; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2725 /* must reference the child n_elif+1 since 'else' token is third, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2726 not fourth, child from the end. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2727 if (TYPE(CHILD(n, (n_elif + 1))) == NAME |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2728 && STR(CHILD(n, (n_elif + 1)))[2] == 's') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2729 has_else = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2730 n_elif -= 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2731 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2732 n_elif /= 4; |
| 35742 | 2733 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2734 if (has_else) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2735 asdl_seq *suite_seq2; |
| 35742 | 2736 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2737 orelse = asdl_seq_new(1, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2738 if (!orelse) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2739 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2740 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2741 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2742 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2743 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2744 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2745 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2746 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2747 if (!suite_seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2748 return NULL; |
| 35742 | 2749 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2750 asdl_seq_SET(orelse, 0, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2751 If(expression, suite_seq, suite_seq2, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2752 LINENO(CHILD(n, NCH(n) - 6)), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2753 CHILD(n, NCH(n) - 6)->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2754 c->c_arena)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2755 /* the just-created orelse handled the last elif */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2756 n_elif--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2757 } |
| 35742 | 2758 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2759 for (i = 0; i < n_elif; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2760 int off = 5 + (n_elif - i - 1) * 4; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2761 asdl_seq *newobj = asdl_seq_new(1, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2762 if (!newobj) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2763 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2764 expression = ast_for_expr(c, CHILD(n, off)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2765 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2766 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2767 suite_seq = ast_for_suite(c, CHILD(n, off + 2)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2768 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2769 return NULL; |
| 35742 | 2770 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2771 asdl_seq_SET(newobj, 0, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2772 If(expression, suite_seq, orelse, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2773 LINENO(CHILD(n, off)), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2774 CHILD(n, off)->n_col_offset, c->c_arena)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2775 orelse = newobj; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2776 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2777 expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2778 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2779 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2780 suite_seq = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2781 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2782 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2783 return If(expression, suite_seq, orelse, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2784 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2785 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2786 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2787 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2788 "unexpected token in 'if' statement: %s", s); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2789 return NULL; |
| 35742 | 2790 } |
| 2791 | |
| 2792 static stmt_ty | |
| 2793 ast_for_while_stmt(struct compiling *c, const node *n) | |
| 2794 { | |
| 2795 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */ | |
| 2796 REQ(n, while_stmt); | |
| 2797 | |
| 2798 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2799 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2800 asdl_seq *suite_seq; |
| 35742 | 2801 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2802 expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2803 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2804 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2805 suite_seq = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2806 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2807 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2808 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2809 c->c_arena); |
| 35742 | 2810 } |
| 2811 else if (NCH(n) == 7) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2812 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2813 asdl_seq *seq1, *seq2; |
| 35742 | 2814 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2815 expression = ast_for_expr(c, CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2816 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2817 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2818 seq1 = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2819 if (!seq1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2820 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2821 seq2 = ast_for_suite(c, CHILD(n, 6)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2822 if (!seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2823 return NULL; |
| 35742 | 2824 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2825 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2826 c->c_arena); |
| 35742 | 2827 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2828 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2829 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2830 "wrong number of tokens for 'while' statement: %d", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2831 NCH(n)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2832 return NULL; |
| 35742 | 2833 } |
| 2834 | |
| 2835 static stmt_ty | |
| 2836 ast_for_for_stmt(struct compiling *c, const node *n) | |
| 2837 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2838 asdl_seq *_target, *seq = NULL, *suite_seq; |
| 35742 | 2839 expr_ty expression; |
| 2840 expr_ty target; | |
|
39067
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2841 const node *node_target; |
| 35742 | 2842 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ |
| 2843 REQ(n, for_stmt); | |
| 2844 | |
| 2845 if (NCH(n) == 9) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2846 seq = ast_for_suite(c, CHILD(n, 8)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2847 if (!seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2848 return NULL; |
| 35742 | 2849 } |
| 2850 | |
|
39067
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2851 node_target = CHILD(n, 1); |
|
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2852 _target = ast_for_exprlist(c, node_target, Store); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2853 if (!_target) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2854 return NULL; |
|
39067
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2855 /* Check the # of children rather than the length of _target, since |
|
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2856 for x, in ... has 1 element in _target, but still requires a Tuple. */ |
|
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2857 if (NCH(node_target) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2858 target = (expr_ty)asdl_seq_GET(_target, 0); |
| 35742 | 2859 else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2860 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2861 |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2862 expression = ast_for_testlist(c, CHILD(n, 3)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2863 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2864 return NULL; |
| 35742 | 2865 suite_seq = ast_for_suite(c, CHILD(n, 5)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2866 if (!suite_seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2867 return NULL; |
| 35742 | 2868 |
|
37453
16a64e394602
Add lineno, col_offset to excephandler to enable future fix for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
37235
diff
changeset
|
2869 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2870 c->c_arena); |
| 35742 | 2871 } |
| 2872 | |
| 2873 static excepthandler_ty | |
| 2874 ast_for_except_clause(struct compiling *c, const node *exc, node *body) | |
| 2875 { | |
|
41773
f19e631be101
Backport PEP 3110's new 'except' syntax to 2.6.
Collin Winter <collinw@gmail.com>
parents:
41579
diff
changeset
|
2876 /* except_clause: 'except' [test [(',' | 'as') test]] */ |
| 35742 | 2877 REQ(exc, except_clause); |
| 2878 REQ(body, suite); | |
| 2879 | |
| 2880 if (NCH(exc) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2881 asdl_seq *suite_seq = ast_for_suite(c, body); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2882 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2883 return NULL; |
| 35742 | 2884 |
|
46200
2ff88ae9850c
Patch #2511: Give the "excepthandler" AST item proper attributes by making it a Sum.
Georg Brandl <georg@python.org>
parents:
46118
diff
changeset
|
2885 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc), |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2886 exc->n_col_offset, c->c_arena); |
| 35742 | 2887 } |
| 2888 else if (NCH(exc) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2889 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2890 asdl_seq *suite_seq; |
| 35742 | 2891 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2892 expression = ast_for_expr(c, CHILD(exc, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2893 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2894 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2895 suite_seq = ast_for_suite(c, body); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2896 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2897 return NULL; |
| 35742 | 2898 |
|
46200
2ff88ae9850c
Patch #2511: Give the "excepthandler" AST item proper attributes by making it a Sum.
Georg Brandl <georg@python.org>
parents:
46118
diff
changeset
|
2899 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc), |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2900 exc->n_col_offset, c->c_arena); |
| 35742 | 2901 } |
| 2902 else if (NCH(exc) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2903 asdl_seq *suite_seq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2904 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2905 expr_ty e = ast_for_expr(c, CHILD(exc, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2906 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2907 return NULL; |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
2908 if (!set_context(c, e, Store, CHILD(exc, 3))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2909 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2910 expression = ast_for_expr(c, CHILD(exc, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2911 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2912 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2913 suite_seq = ast_for_suite(c, body); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2914 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2915 return NULL; |
| 35742 | 2916 |
|
46200
2ff88ae9850c
Patch #2511: Give the "excepthandler" AST item proper attributes by making it a Sum.
Georg Brandl <georg@python.org>
parents:
46118
diff
changeset
|
2917 return ExceptHandler(expression, e, suite_seq, LINENO(exc), |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2918 exc->n_col_offset, c->c_arena); |
| 35742 | 2919 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2920 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2921 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2922 "wrong number of children for 'except' clause: %d", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2923 NCH(exc)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2924 return NULL; |
| 35742 | 2925 } |
| 2926 | |
| 2927 static stmt_ty | |
| 2928 ast_for_try_stmt(struct compiling *c, const node *n) | |
| 2929 { | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2930 const int nch = NCH(n); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2931 int n_except = (nch - 3)/3; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2932 asdl_seq *body, *orelse = NULL, *finally = NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2933 |
| 35742 | 2934 REQ(n, try_stmt); |
| 2935 | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2936 body = ast_for_suite(c, CHILD(n, 2)); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2937 if (body == NULL) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2938 return NULL; |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2939 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2940 if (TYPE(CHILD(n, nch - 3)) == NAME) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2941 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2942 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2943 /* we can assume it's an "else", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2944 because nch >= 9 for try-else-finally and |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2945 it would otherwise have a type of except_clause */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2946 orelse = ast_for_suite(c, CHILD(n, nch - 4)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2947 if (orelse == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2948 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2949 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2950 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2951 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2952 finally = ast_for_suite(c, CHILD(n, nch - 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2953 if (finally == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2954 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2955 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2956 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2957 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2958 /* we can assume it's an "else", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2959 otherwise it would have a type of except_clause */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2960 orelse = ast_for_suite(c, CHILD(n, nch - 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2961 if (orelse == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2962 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2963 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2964 } |
| 35742 | 2965 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2966 else if (TYPE(CHILD(n, nch - 3)) != except_clause) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2967 ast_error(n, "malformed 'try' statement"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2968 return NULL; |
| 35742 | 2969 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2970 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2971 if (n_except > 0) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2972 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2973 stmt_ty except_st; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2974 /* process except statements to create a try ... except */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2975 asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2976 if (handlers == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2977 return NULL; |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2978 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2979 for (i = 0; i < n_except; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2980 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2981 CHILD(n, 5 + i * 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2982 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2983 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2984 asdl_seq_SET(handlers, i, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2985 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2986 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2987 except_st = TryExcept(body, handlers, orelse, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2988 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2989 if (!finally) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2990 return except_st; |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2991 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2992 /* if a 'finally' is present too, we nest the TryExcept within a |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2993 TryFinally to emulate try ... except ... finally */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2994 body = asdl_seq_new(1, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2995 if (body == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2996 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2997 asdl_seq_SET(body, 0, except_st); |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2998 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2999 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3000 /* must be a try ... finally (except clauses are in body, if any exist) */ |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3001 assert(finally != NULL); |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
3002 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3003 } |
| 3004 | |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3005 static expr_ty |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3006 ast_for_with_var(struct compiling *c, const node *n) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3007 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3008 REQ(n, with_var); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3009 return ast_for_expr(c, CHILD(n, 1)); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3010 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3011 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3012 /* with_stmt: 'with' test [ with_var ] ':' suite */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3013 static stmt_ty |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3014 ast_for_with_stmt(struct compiling *c, const node *n) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3015 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3016 expr_ty context_expr, optional_vars = NULL; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3017 int suite_index = 3; /* skip 'with', test, and ':' */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3018 asdl_seq *suite_seq; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3019 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3020 assert(TYPE(n) == with_stmt); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3021 context_expr = ast_for_expr(c, CHILD(n, 1)); |
|
41205
b43a52f71696
Patch #1642547: Fix an error/crash when encountering syntax errors in complex if statements.
Collin Winter <collinw@gmail.com>
parents:
40972
diff
changeset
|
3022 if (!context_expr) |
|
b43a52f71696
Patch #1642547: Fix an error/crash when encountering syntax errors in complex if statements.
Collin Winter <collinw@gmail.com>
parents:
40972
diff
changeset
|
3023 return NULL; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3024 if (TYPE(CHILD(n, 2)) == with_var) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3025 optional_vars = ast_for_with_var(c, CHILD(n, 2)); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3026 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3027 if (!optional_vars) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3028 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3029 } |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3030 if (!set_context(c, optional_vars, Store, n)) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3031 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3032 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3033 suite_index = 4; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3034 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3035 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3036 suite_seq = ast_for_suite(c, CHILD(n, suite_index)); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3037 if (!suite_seq) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3038 return NULL; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3039 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
3040 return With(context_expr, optional_vars, suite_seq, LINENO(n), |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3041 n->n_col_offset, c->c_arena); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3042 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3043 |
| 35742 | 3044 static stmt_ty |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3045 ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 3046 { |
| 3047 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */ | |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3048 PyObject *classname; |
| 35742 | 3049 asdl_seq *bases, *s; |
| 3050 | |
| 3051 REQ(n, classdef); | |
| 3052 | |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
3053 if (!forbidden_check(c, n, STR(CHILD(n, 1)))) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3054 return NULL; |
| 35742 | 3055 |
| 3056 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3057 s = ast_for_suite(c, CHILD(n, 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3058 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3059 return NULL; |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3060 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3061 if (!classname) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3062 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3063 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n), |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3064 n->n_col_offset, c->c_arena); |
| 35742 | 3065 } |
| 3066 /* check for empty base list */ | |
| 3067 if (TYPE(CHILD(n,3)) == RPAR) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3068 s = ast_for_suite(c, CHILD(n,5)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3069 if (!s) |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3070 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3071 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3072 if (!classname) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3073 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3074 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n), |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3075 n->n_col_offset, c->c_arena); |
| 35742 | 3076 } |
| 3077 | |
| 3078 /* else handle the base class list */ | |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
3079 bases = ast_for_class_bases(c, CHILD(n, 3)); |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
3080 if (!bases) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3081 return NULL; |
| 35742 | 3082 |
| 3083 s = ast_for_suite(c, CHILD(n, 6)); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3084 if (!s) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3085 return NULL; |
|
49843
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3086 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3087 if (!classname) |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3088 return NULL; |
|
96f38e357194
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49796
diff
changeset
|
3089 return ClassDef(classname, bases, s, decorator_seq, |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3090 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3091 } |
| 3092 | |
| 3093 static stmt_ty | |
| 3094 ast_for_stmt(struct compiling *c, const node *n) | |
| 3095 { | |
| 3096 if (TYPE(n) == stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3097 assert(NCH(n) == 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3098 n = CHILD(n, 0); |
| 35742 | 3099 } |
| 3100 if (TYPE(n) == simple_stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3101 assert(num_stmts(n) == 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3102 n = CHILD(n, 0); |
| 35742 | 3103 } |
| 3104 if (TYPE(n) == small_stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3105 REQ(n, small_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3106 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3107 /* small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3108 | flow_stmt | import_stmt | global_stmt | exec_stmt |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3109 | assert_stmt |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3110 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3111 switch (TYPE(n)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3112 case expr_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3113 return ast_for_expr_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3114 case print_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3115 return ast_for_print_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3116 case del_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3117 return ast_for_del_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3118 case pass_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3119 return Pass(LINENO(n), n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3120 case flow_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3121 return ast_for_flow_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3122 case import_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3123 return ast_for_import_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3124 case global_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3125 return ast_for_global_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3126 case exec_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3127 return ast_for_exec_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3128 case assert_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3129 return ast_for_assert_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3130 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3131 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3132 "unhandled small_stmt: TYPE=%d NCH=%d\n", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3133 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3134 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3135 } |
| 35742 | 3136 } |
| 3137 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3138 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3139 | funcdef | classdef | decorated |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3140 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3141 node *ch = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3142 REQ(n, compound_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3143 switch (TYPE(ch)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3144 case if_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3145 return ast_for_if_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3146 case while_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3147 return ast_for_while_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3148 case for_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3149 return ast_for_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3150 case try_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3151 return ast_for_try_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3152 case with_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3153 return ast_for_with_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3154 case funcdef: |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3155 return ast_for_funcdef(c, ch, NULL); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3156 case classdef: |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3157 return ast_for_classdef(c, ch, NULL); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3158 case decorated: |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3159 return ast_for_decorated(c, ch); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3160 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3161 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3162 "unhandled small_stmt: TYPE=%d NCH=%d\n", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3163 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3164 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3165 } |
| 35742 | 3166 } |
| 3167 } | |
| 3168 | |
| 3169 static PyObject * | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3170 parsenumber(struct compiling *c, const char *s) |
| 35742 | 3171 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3172 const char *end; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3173 long x; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3174 double dx; |
| 35742 | 3175 #ifndef WITHOUT_COMPLEX |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3176 Py_complex complex; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3177 int imflag; |
| 35742 | 3178 #endif |
| 3179 | |
|
50029
20a1ccaddcae
Merged revisions 67590 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49843
diff
changeset
|
3180 assert(s != NULL); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3181 errno = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3182 end = s + strlen(s) - 1; |
| 35742 | 3183 #ifndef WITHOUT_COMPLEX |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3184 imflag = *end == 'j' || *end == 'J'; |
| 35742 | 3185 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3186 if (*end == 'l' || *end == 'L') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3187 return PyLong_FromString((char *)s, (char **)0, 0); |
|
47977
c0ab2bafb264
Issue #3360: Fix incorrect parsing of "020000000000.0".
Mark Dickinson <dickinsm@gmail.com>
parents:
47860
diff
changeset
|
3188 x = PyOS_strtol((char *)s, (char **)&end, 0); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3189 if (*end == '\0') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3190 if (errno != 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3191 return PyLong_FromString((char *)s, (char **)0, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3192 return PyInt_FromLong(x); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3193 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3194 /* XXX Huge floats may silently fail */ |
| 35742 | 3195 #ifndef WITHOUT_COMPLEX |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3196 if (imflag) { |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3197 complex.real = 0.; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3198 PyFPE_START_PROTECT("atof", return 0) |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3199 complex.imag = PyOS_ascii_atof(s); |
|
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3200 PyFPE_END_PROTECT(complex) |
|
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3201 return PyComplex_FromCComplex(complex); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3202 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3203 else |
| 35742 | 3204 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3205 { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3206 PyFPE_START_PROTECT("atof", return 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3207 dx = PyOS_ascii_atof(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3208 PyFPE_END_PROTECT(dx) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3209 return PyFloat_FromDouble(dx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3210 } |
| 35742 | 3211 } |
| 3212 | |
| 3213 static PyObject * | |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3214 decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding) |
| 35742 | 3215 { |
| 3216 #ifndef Py_USING_UNICODE | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3217 Py_FatalError("decode_utf8 should not be called in this build."); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3218 return NULL; |
| 35742 | 3219 #else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3220 PyObject *u, *v; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3221 char *s, *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3222 t = s = (char *)*sPtr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3223 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3224 while (s < end && (*s & 0x80)) s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3225 *sPtr = s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3226 u = PyUnicode_DecodeUTF8(t, s - t, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3227 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3228 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3229 v = PyUnicode_AsEncodedString(u, encoding, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3230 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3231 return v; |
| 35742 | 3232 #endif |
| 3233 } | |
| 3234 | |
|
42459
dbfc3cf1522d
Place #ifdef Py_USING_UNICODE around decode_unicode().
Georg Brandl <georg@python.org>
parents:
42308
diff
changeset
|
3235 #ifdef Py_USING_UNICODE |
| 35742 | 3236 static PyObject * |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3237 decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding) |
| 35742 | 3238 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3239 PyObject *v, *u; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3240 char *buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3241 char *p; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3242 const char *end; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3243 if (encoding == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3244 buf = (char *)s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3245 u = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3246 } else if (strcmp(encoding, "iso-8859-1") == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3247 buf = (char *)s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3248 u = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3249 } else { |
|
47587
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
3250 /* check for integer overflow */ |
|
56959
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3251 if (len > PY_SIZE_MAX / 6) |
|
47587
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
3252 return NULL; |
|
56959
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3253 /* "<C3><A4>" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5 |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3254 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */ |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3255 u = PyString_FromStringAndSize((char *)NULL, len * 6); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3256 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3257 return NULL; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3258 p = buf = PyString_AsString(u); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3259 end = s + len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3260 while (s < end) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3261 if (*s == '\\') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3262 *p++ = *s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3263 if (*s & 0x80) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3264 strcpy(p, "u005c"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3265 p += 5; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3266 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3267 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3268 if (*s & 0x80) { /* XXX inefficient */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3269 PyObject *w; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3270 char *r; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3271 Py_ssize_t rn, i; |
|
56959
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3272 w = decode_utf8(c, &s, end, "utf-32-be"); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3273 if (w == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3274 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3275 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3276 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3277 r = PyString_AsString(w); |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3278 rn = PyString_Size(w); |
|
56959
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3279 assert(rn % 4 == 0); |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3280 for (i = 0; i < rn; i += 4) { |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3281 sprintf(p, "\\U%02x%02x%02x%02x", |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3282 r[i + 0] & 0xFF, |
|
56959
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3283 r[i + 1] & 0xFF, |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3284 r[i + 2] & 0xFF, |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3285 r[i + 3] & 0xFF); |
|
032d9749047d
Merged revisions 75931 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50029
diff
changeset
|
3286 p += 10; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3287 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3288 Py_DECREF(w); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3289 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3290 *p++ = *s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3291 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3292 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3293 len = p - buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3294 s = buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3295 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3296 if (rawmode) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3297 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3298 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3299 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3300 Py_XDECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3301 return v; |
| 35742 | 3302 } |
|
42459
dbfc3cf1522d
Place #ifdef Py_USING_UNICODE around decode_unicode().
Georg Brandl <georg@python.org>
parents:
42308
diff
changeset
|
3303 #endif |
| 35742 | 3304 |
| 3305 /* s is a Python string literal, including the bracketing quote characters, | |
| 3306 * and r &/or u prefixes (if any), and embedded escape sequences (if any). | |
| 3307 * parsestr parses it, and returns the decoded Python string object. | |
| 3308 */ | |
| 3309 static PyObject * | |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3310 parsestr(struct compiling *c, const char *s) |
| 35742 | 3311 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3312 size_t len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3313 int quote = Py_CHARMASK(*s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3314 int rawmode = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3315 int need_encoding; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3316 int unicode = c->c_future_unicode; |
| 35742 | 3317 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3318 if (isalpha(quote) || quote == '_') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3319 if (quote == 'u' || quote == 'U') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3320 quote = *++s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3321 unicode = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3322 } |
|
44747
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3323 if (quote == 'b' || quote == 'B') { |
|
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3324 quote = *++s; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3325 unicode = 0; |
|
44747
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3326 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3327 if (quote == 'r' || quote == 'R') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3328 quote = *++s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3329 rawmode = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3330 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3331 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3332 if (quote != '\'' && quote != '\"') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3333 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3334 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3335 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3336 s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3337 len = strlen(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3338 if (len > INT_MAX) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3339 PyErr_SetString(PyExc_OverflowError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3340 "string to parse is too long"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3341 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3342 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3343 if (s[--len] != quote) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3344 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3345 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3346 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3347 if (len >= 4 && s[0] == quote && s[1] == quote) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3348 s += 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3349 len -= 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3350 if (s[--len] != quote || s[--len] != quote) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3351 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3352 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3353 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3354 } |
| 35742 | 3355 #ifdef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3356 if (unicode || Py_UnicodeFlag) { |
|
46642
0deb4ab0426e
The compiling struct is now passed around to all AST helpers (see issue 2720)
Benjamin Peterson <benjamin@python.org>
parents:
46200
diff
changeset
|
3357 return decode_unicode(c, s, len, rawmode, c->c_encoding); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3358 } |
| 35742 | 3359 #endif |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3360 need_encoding = (c->c_encoding != NULL && |
|
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3361 strcmp(c->c_encoding, "utf-8") != 0 && |
|
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3362 strcmp(c->c_encoding, "iso-8859-1") != 0); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3363 if (rawmode || strchr(s, '\\') == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3364 if (need_encoding) { |
| 35742 | 3365 #ifndef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3366 /* This should not happen - we never see any other |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3367 encoding. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3368 Py_FatalError( |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3369 "cannot deal with encodings in this build."); |
| 35742 | 3370 #else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3371 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3372 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3373 return NULL; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3374 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3375 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3376 return v; |
| 35742 | 3377 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3378 } else { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3379 return PyString_FromStringAndSize(s, len); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3380 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3381 } |
| 35742 | 3382 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3383 return PyString_DecodeEscape(s, len, NULL, unicode, |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3384 need_encoding ? c->c_encoding : NULL); |
| 35742 | 3385 } |
| 3386 | |
| 3387 /* Build a Python string object out of a STRING atom. This takes care of | |
| 3388 * compile-time literal catenation, calling parsestr() on each piece, and | |
| 3389 * pasting the intermediate results together. | |
| 3390 */ | |
| 3391 static PyObject * | |
| 3392 parsestrplus(struct compiling *c, const node *n) | |
| 3393 { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3394 PyObject *v; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3395 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3396 REQ(CHILD(n, 0), STRING); |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3397 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3398 /* String literal concatenation */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3399 for (i = 1; i < NCH(n); i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3400 PyObject *s; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3401 s = parsestr(c, STR(CHILD(n, i))); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3402 if (s == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3403 goto onError; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3404 if (PyString_Check(v) && PyString_Check(s)) { |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3405 PyString_ConcatAndDel(&v, s); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3406 if (v == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3407 goto onError; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3408 } |
| 35742 | 3409 #ifdef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3410 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3411 PyObject *temp = PyUnicode_Concat(v, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3412 Py_DECREF(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3413 Py_DECREF(v); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3414 v = temp; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3415 if (v == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3416 goto onError; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3417 } |
| 35742 | 3418 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3419 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3420 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3421 return v; |
| 35742 | 3422 |
| 3423 onError: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3424 Py_XDECREF(v); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3425 return NULL; |
| 35742 | 3426 } |
