Mercurial > cpython-lru_cache-weakref
annotate Python/ast.c @ 49955:878d40468c4e legacy-trunk
Issue #4384: Added logging integration with warnings module using captureWarnings(). This change includes a NullHandler which does nothing; it will be of use to library developers who want to avoid the "No handlers could be found for logger XXX" message which can appear if the library user doesn't configure logging.
| author | Vinay Sajip <vinay_sajip@yahoo.co.uk> |
|---|---|
| date | Wed, 03 Dec 2008 23:22:58 +0000 |
| parents | ffad6c0f252e |
| children | 57b5c4639a5d |
| 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); |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
50 if (id != NULL) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
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")) |
|
49696
2e0857b0fc67
check for assignment to __debug__ during AST generation
Benjamin Peterson <benjamin@python.org>
parents:
49584
diff
changeset
|
134 return ast_error(n, "cannot assign to None"); |
|
2e0857b0fc67
check for assignment to __debug__ during AST generation
Benjamin Peterson <benjamin@python.org>
parents:
49584
diff
changeset
|
135 if (!strcmp(x, "__debug__")) |
|
2e0857b0fc67
check for assignment to __debug__ during AST generation
Benjamin Peterson <benjamin@python.org>
parents:
49584
diff
changeset
|
136 return ast_error(n, "cannot assign to __debug__"); |
|
49584
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
137 if (Py_Py3kWarningFlag) { |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
138 if (!(strcmp(x, "True") && strcmp(x, "False")) && |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
139 !ast_warn(c, n, "assignment to True or False is forbidden in 3.x")) |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
140 return 0; |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
141 if (!strcmp(x, "nonlocal") && |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
142 !ast_warn(c, n, "nonlocal is a keyword in 3.x")) |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
143 return 0; |
|
6634530a04e0
give a py3k warning when 'nonlocal' is used as a variable name
Benjamin Peterson <benjamin@python.org>
parents:
48307
diff
changeset
|
144 } |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
145 return 1; |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
146 } |
|
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
147 |
| 35742 | 148 /* num_stmts() returns number of contained statements. |
| 149 | |
| 150 Use this routine to determine how big a sequence is needed for | |
| 151 the statements in a parse tree. Its raison d'etre is this bit of | |
| 152 grammar: | |
| 153 | |
| 154 stmt: simple_stmt | compound_stmt | |
| 155 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE | |
| 156 | |
| 157 A simple_stmt can contain multiple small_stmt elements joined | |
| 158 by semicolons. If the arg is a simple_stmt, the number of | |
| 159 small_stmt elements is returned. | |
| 160 */ | |
| 161 | |
| 162 static int | |
| 163 num_stmts(const node *n) | |
| 164 { | |
| 165 int i, l; | |
| 166 node *ch; | |
| 167 | |
| 168 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
169 case single_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
170 if (TYPE(CHILD(n, 0)) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
171 return 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
172 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
173 return num_stmts(CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
174 case file_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
175 l = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
176 for (i = 0; i < NCH(n); i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
177 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
178 if (TYPE(ch) == stmt) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
179 l += num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
180 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
181 return l; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
182 case stmt: |
|
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 case compound_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
185 return 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
186 case simple_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
187 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
|
188 case suite: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
189 if (NCH(n) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
190 return num_stmts(CHILD(n, 0)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
191 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
192 l = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
193 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
|
194 l += num_stmts(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
195 return l; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
196 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
197 default: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
198 char buf[128]; |
| 35742 | 199 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
200 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
|
201 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
202 Py_FatalError(buf); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
203 } |
| 35742 | 204 } |
| 205 assert(0); | |
| 206 return 0; | |
| 207 } | |
| 208 | |
| 209 /* Transform the CST rooted at node * to the appropriate AST | |
| 210 */ | |
| 211 | |
| 212 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
|
213 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
|
214 PyArena *arena) |
| 35742 | 215 { |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
216 int i, j, k, num; |
| 35742 | 217 asdl_seq *stmts = NULL; |
| 218 stmt_ty s; | |
| 219 node *ch; | |
| 220 struct compiling c; | |
| 221 | |
| 222 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
|
223 c.c_encoding = "utf-8"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
224 if (TYPE(n) == encoding_decl) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
225 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
|
226 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
227 } |
| 35742 | 228 } else if (TYPE(n) == encoding_decl) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
229 c.c_encoding = STR(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
230 n = CHILD(n, 0); |
| 35742 | 231 } else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
232 c.c_encoding = NULL; |
| 35742 | 233 } |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
234 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
|
235 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
|
236 c.c_filename = filename; |
| 35742 | 237 |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
238 k = 0; |
| 35742 | 239 switch (TYPE(n)) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
240 case file_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
241 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
|
242 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
243 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
244 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
|
245 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
246 if (TYPE(ch) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
247 continue; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
248 REQ(ch, stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
249 num = num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
250 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
251 s = ast_for_stmt(&c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
252 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
253 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
254 asdl_seq_SET(stmts, k++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
255 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
256 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
257 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
258 REQ(ch, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
259 for (j = 0; j < num; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
260 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
|
261 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
262 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
263 asdl_seq_SET(stmts, k++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
264 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
265 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
266 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
267 return Module(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
268 case eval_input: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
269 expr_ty testlist_ast; |
| 35742 | 270 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
271 /* XXX Why not gen_for here? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
272 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
|
273 if (!testlist_ast) |
|
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 return Expression(testlist_ast, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
276 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
277 case single_input: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
278 if (TYPE(CHILD(n, 0)) == NEWLINE) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
279 stmts = asdl_seq_new(1, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
280 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
281 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
282 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
|
283 arena)); |
|
41579
7a4f174df844
Handle a couple of uncaught errors. This should be backported
Neal Norwitz <nnorwitz@gmail.com>
parents:
41578
diff
changeset
|
284 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
|
285 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
286 return Interactive(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
287 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
288 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
289 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
290 num = num_stmts(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
291 stmts = asdl_seq_new(num, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
292 if (!stmts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
293 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
294 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
295 s = ast_for_stmt(&c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
296 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
297 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
298 asdl_seq_SET(stmts, 0, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
299 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
300 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
301 /* 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
|
302 REQ(n, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
303 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
|
304 if (TYPE(CHILD(n, i)) == NEWLINE) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
305 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
306 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
|
307 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
308 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
309 asdl_seq_SET(stmts, i / 2, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
310 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
311 } |
| 35742 | 312 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
313 return Interactive(stmts, arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
314 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
315 default: |
|
41578
bc6a0fe32351
Actually raise an exception before calling ast_error_finish.
Georg Brandl <georg@python.org>
parents:
41215
diff
changeset
|
316 PyErr_Format(PyExc_SystemError, |
|
bc6a0fe32351
Actually raise an exception before calling ast_error_finish.
Georg Brandl <georg@python.org>
parents:
41215
diff
changeset
|
317 "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
|
318 goto error; |
| 35742 | 319 } |
| 320 error: | |
| 321 ast_error_finish(filename); | |
| 322 return NULL; | |
| 323 } | |
| 324 | |
| 325 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) | |
| 326 */ | |
| 327 | |
| 328 static operator_ty | |
| 329 get_operator(const node *n) | |
| 330 { | |
| 331 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
332 case VBAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
333 return BitOr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
334 case CIRCUMFLEX: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
335 return BitXor; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
336 case AMPER: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
337 return BitAnd; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
338 case LEFTSHIFT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
339 return LShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
340 case RIGHTSHIFT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
341 return RShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
342 case PLUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
343 return Add; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
344 case MINUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
345 return Sub; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
346 case STAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
347 return Mult; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
348 case SLASH: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
349 return Div; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
350 case DOUBLESLASH: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
351 return FloorDiv; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
352 case PERCENT: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
353 return Mod; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
354 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
355 return (operator_ty)0; |
| 35742 | 356 } |
| 357 } | |
| 358 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
359 /* Set the context ctx for expr_ty e, recursively traversing e. |
| 35742 | 360 |
| 361 Only sets context for expr kinds that "can appear in assignment context" | |
| 362 (according to ../Parser/Python.asdl). For other expr kinds, it sets | |
| 363 an appropriate syntax error and returns false. | |
| 364 */ | |
| 365 | |
| 366 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
|
367 set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) |
| 35742 | 368 { |
| 369 asdl_seq *s = NULL; | |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
370 /* 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
|
371 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
|
372 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
373 const char* expr_name = NULL; |
|
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 /* 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
|
376 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
|
377 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
|
378 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
|
379 Consider restructuring so that augmented assignment uses |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
380 set_context(), too. |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
381 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
382 assert(ctx != AugStore && ctx != AugLoad); |
| 35742 | 383 |
| 384 switch (e->kind) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
385 case Attribute_kind: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
386 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
|
387 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
|
388 return 0; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
389 e->v.Attribute.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
390 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
391 case Subscript_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
392 e->v.Subscript.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
393 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
394 case Name_kind: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
395 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
|
396 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
|
397 return 0; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
398 e->v.Name.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
399 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
400 case List_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
401 e->v.List.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
402 s = e->v.List.elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
403 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
404 case Tuple_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
405 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
|
406 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
|
407 e->v.Tuple.ctx = ctx; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
408 s = e->v.Tuple.elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
409 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
410 case Lambda_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
411 expr_name = "lambda"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
412 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
413 case Call_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
414 expr_name = "function call"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
415 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
416 case BoolOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
417 case BinOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
418 case UnaryOp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
419 expr_name = "operator"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
420 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
421 case GeneratorExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
422 expr_name = "generator expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
423 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
424 case Yield_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
425 expr_name = "yield expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
426 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
427 case ListComp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
428 expr_name = "list comprehension"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
429 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
430 case Dict_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
431 case Num_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
432 case Str_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
433 expr_name = "literal"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
434 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
435 case Compare_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
436 expr_name = "comparison"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
437 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
438 case Repr_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
439 expr_name = "repr"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
440 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
441 case IfExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
442 expr_name = "conditional expression"; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
443 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
444 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
445 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
446 "unexpected expression in assignment %d (line %d)", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
447 e->kind, e->lineno); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
448 return 0; |
| 35742 | 449 } |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
450 /* Check for error string set by switch */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
451 if (expr_name) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
452 char buf[300]; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
453 PyOS_snprintf(buf, sizeof(buf), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
454 "can't %s %s", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
455 ctx == Store ? "assign to" : "delete", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
456 expr_name); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
457 return ast_error(n, buf); |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
458 } |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
459 |
| 35742 | 460 /* 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
|
461 context for all the contained elements. |
| 35742 | 462 */ |
| 463 if (s) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
464 int i; |
| 35742 | 465 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
466 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
|
467 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
|
468 return 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
469 } |
| 35742 | 470 } |
| 471 return 1; | |
| 472 } | |
| 473 | |
| 474 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
|
475 ast_for_augassign(struct compiling *c, const node *n) |
| 35742 | 476 { |
| 477 REQ(n, augassign); | |
| 478 n = CHILD(n, 0); | |
| 479 switch (STR(n)[0]) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
480 case '+': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
481 return Add; |
|
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 Sub; |
|
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 if (STR(n)[1] == '/') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
486 return FloorDiv; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
487 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
488 return Div; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
489 case '%': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
490 return Mod; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
491 case '<': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
492 return LShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
493 case '>': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
494 return RShift; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
495 case '&': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
496 return BitAnd; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
497 case '^': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
498 return BitXor; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
499 case '|': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
500 return BitOr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
501 case '*': |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
502 if (STR(n)[1] == '*') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
503 return Pow; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
504 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
505 return Mult; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
506 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
507 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
|
508 return (operator_ty)0; |
| 35742 | 509 } |
| 510 } | |
| 511 | |
| 512 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
|
513 ast_for_comp_op(struct compiling *c, const node *n) |
| 35742 | 514 { |
| 515 /* comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is' | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
516 |'is' 'not' |
| 35742 | 517 */ |
| 518 REQ(n, comp_op); | |
| 519 if (NCH(n) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
520 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
521 switch (TYPE(n)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
522 case LESS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
523 return Lt; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
524 case GREATER: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
525 return Gt; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
526 case EQEQUAL: /* == */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
527 return Eq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
528 case LESSEQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
529 return LtE; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
530 case GREATEREQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
531 return GtE; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
532 case NOTEQUAL: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
533 return NotEq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
534 case NAME: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
535 if (strcmp(STR(n), "in") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
536 return In; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
537 if (strcmp(STR(n), "is") == 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
538 return Is; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
539 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
540 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
|
541 STR(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
542 return (cmpop_ty)0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
543 } |
| 35742 | 544 } |
| 545 else if (NCH(n) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
546 /* handle "not in" and "is not" */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
547 switch (TYPE(CHILD(n, 0))) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
548 case NAME: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
549 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
|
550 return NotIn; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
551 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
|
552 return IsNot; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
553 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
554 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
|
555 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
|
556 return (cmpop_ty)0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
557 } |
| 35742 | 558 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
559 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
|
560 NCH(n)); |
|
37604
c732f66c913f
Convert 0 to their respective enum types. Convert
Martin v. Löwis <martin@v.loewis.de>
parents:
37597
diff
changeset
|
561 return (cmpop_ty)0; |
| 35742 | 562 } |
| 563 | |
| 564 static asdl_seq * | |
| 565 seq_for_testlist(struct compiling *c, const node *n) | |
| 566 { | |
| 567 /* testlist: test (',' test)* [','] */ | |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
568 asdl_seq *seq; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
569 expr_ty expression; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
570 int i; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
571 assert(TYPE(n) == testlist || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
572 TYPE(n) == listmaker || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
573 TYPE(n) == testlist_gexp || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
574 TYPE(n) == testlist_safe || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
575 TYPE(n) == testlist1); |
| 35742 | 576 |
|
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
|
577 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 578 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
579 return NULL; |
| 35742 | 580 |
| 581 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
|
582 assert(TYPE(CHILD(n, i)) == test || TYPE(CHILD(n, i)) == old_test); |
| 35742 | 583 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
584 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
|
585 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
586 return NULL; |
| 35742 | 587 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
588 assert(i / 2 < seq->size); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
589 asdl_seq_SET(seq, i / 2, expression); |
| 35742 | 590 } |
| 591 return seq; | |
| 592 } | |
| 593 | |
| 594 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
|
595 compiler_complex_args(struct compiling *c, const node *n) |
| 35742 | 596 { |
| 597 int i, len = (NCH(n) + 1) / 2; | |
| 598 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
|
599 asdl_seq *args = asdl_seq_new(len, c->c_arena); |
| 35742 | 600 if (!args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
601 return NULL; |
| 35742 | 602 |
|
39872
b8cb7201379c
Bug #1557232: fix seg fault with def f((((x)))) and def f(((x),)).
Neal Norwitz <nnorwitz@gmail.com>
parents:
39779
diff
changeset
|
603 /* 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
|
604 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
|
605 */ |
| 35742 | 606 REQ(n, fplist); |
| 607 for (i = 0; i < len; i++) { | |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
608 PyObject *arg_id; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
609 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
|
610 const node *child; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
611 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
|
612 set_name: |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
613 /* 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
|
614 child = CHILD(fpdef_node, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
615 if (TYPE(child) == NAME) { |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
616 if (!forbidden_check(c, n, STR(child))) |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
617 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
618 arg_id = NEW_IDENTIFIER(child); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
619 if (!arg_id) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
620 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
621 arg = Name(arg_id, Store, LINENO(child), child->n_col_offset, |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
622 c->c_arena); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
623 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
624 else { |
|
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 /* 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
|
627 child = CHILD(fpdef_node, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
628 assert(TYPE(child) == fplist); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
629 /* 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
|
630 if (NCH(child) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
631 fpdef_node = CHILD(child, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
632 assert(TYPE(fpdef_node) == fpdef); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
633 goto set_name; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
634 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
635 arg = compiler_complex_args(c, child); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
636 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
637 asdl_seq_SET(args, i, arg); |
| 35742 | 638 } |
| 639 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
640 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
|
641 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
|
642 return NULL; |
| 35742 | 643 return result; |
| 644 } | |
| 645 | |
| 646 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
647 /* Create AST for argument list. */ |
| 35742 | 648 |
| 649 static arguments_ty | |
| 650 ast_for_arguments(struct compiling *c, const node *n) | |
| 651 { | |
| 652 /* parameters: '(' [varargslist] ')' | |
| 653 varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
654 | '**' NAME) | fpdef ['=' test] (',' fpdef ['=' test])* [','] |
| 35742 | 655 */ |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
656 int i, j, k, n_args = 0, n_defaults = 0, found_default = 0; |
| 35742 | 657 asdl_seq *args, *defaults; |
| 658 identifier vararg = NULL, kwarg = NULL; | |
| 659 node *ch; | |
| 660 | |
| 661 if (TYPE(n) == parameters) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
662 if (NCH(n) == 2) /* () as argument list */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
663 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
|
664 n = CHILD(n, 1); |
| 35742 | 665 } |
| 666 REQ(n, varargslist); | |
| 667 | |
| 668 /* first count the number of normal args & defaults */ | |
| 669 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
|
670 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
671 if (TYPE(ch) == fpdef) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
672 n_args++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
673 if (TYPE(ch) == EQUAL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
674 n_defaults++; |
| 35742 | 675 } |
|
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
|
676 args = (n_args ? asdl_seq_new(n_args, c->c_arena) : NULL); |
| 35742 | 677 if (!args && n_args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
678 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
|
679 defaults = (n_defaults ? asdl_seq_new(n_defaults, c->c_arena) : NULL); |
| 35742 | 680 if (!defaults && n_defaults) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
681 return NULL; /* Don't need to goto error; no objects allocated */ |
| 35742 | 682 |
| 683 /* fpdef: NAME | '(' fplist ')' | |
| 684 fplist: fpdef (',' fpdef)* [','] | |
| 685 */ | |
| 686 i = 0; | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
687 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
|
688 k = 0; /* index for args */ |
| 35742 | 689 while (i < NCH(n)) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
690 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
691 switch (TYPE(ch)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
692 case fpdef: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
693 handle_fpdef: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
694 /* 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
|
695 anything other than EQUAL or a comma? */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
696 /* 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
|
697 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
|
698 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
|
699 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
700 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
701 assert(defaults != NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
702 asdl_seq_SET(defaults, j++, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
703 i += 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
704 found_default = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
705 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
706 else if (found_default) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
707 ast_error(n, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
708 "non-default argument follows default argument"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
709 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
710 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
711 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
712 ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
713 /* 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
|
714 if (NCH(ch) != 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
715 /* We have complex arguments, setup for unpacking. */ |
|
47524
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
716 if (Py_Py3kWarningFlag && !ast_warn(c, ch, |
|
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
717 "tuple parameter unpacking has been removed in 3.x")) |
|
53253f36014e
warn about parameter tuple unpacking
Benjamin Peterson <benjamin@python.org>
parents:
47523
diff
changeset
|
718 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
719 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
|
720 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
|
721 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
722 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
723 /* 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
|
724 /* 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
|
725 unpacking mixed in. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
726 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
727 assert(TYPE(ch) == fpdef); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
728 goto handle_fpdef; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
729 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
730 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
731 if (TYPE(CHILD(ch, 0)) == NAME) { |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
732 PyObject *id; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
733 expr_ty name; |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
734 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
|
735 goto error; |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
736 id = NEW_IDENTIFIER(CHILD(ch, 0)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
737 if (!id) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
738 goto error; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
739 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
|
740 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
741 if (!name) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
742 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
743 asdl_seq_SET(args, k++, name); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
744 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
745 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
746 i += 2; /* the name and the comma */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
747 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
748 case STAR: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
749 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
|
750 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
751 vararg = NEW_IDENTIFIER(CHILD(n, i+1)); |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
752 if (!vararg) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
753 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
754 i += 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
755 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
756 case DOUBLESTAR: |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
757 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
|
758 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
759 kwarg = NEW_IDENTIFIER(CHILD(n, i+1)); |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
760 if (!kwarg) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
761 goto error; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
762 i += 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
763 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
764 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
765 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
766 "unexpected node in varargslist: %d @ %d", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
767 TYPE(ch), i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
768 goto error; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
769 } |
| 35742 | 770 } |
| 771 | |
|
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
|
772 return arguments(args, vararg, kwarg, defaults, c->c_arena); |
| 35742 | 773 |
| 774 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
|
775 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
|
776 Py_XDECREF(kwarg); |
| 35742 | 777 return NULL; |
| 778 } | |
| 779 | |
| 780 static expr_ty | |
| 781 ast_for_dotted_name(struct compiling *c, const node *n) | |
| 782 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
783 expr_ty e; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
784 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
|
785 int lineno, col_offset; |
| 35742 | 786 int i; |
| 787 | |
| 788 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
|
789 |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
790 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
|
791 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
|
792 |
| 35742 | 793 id = NEW_IDENTIFIER(CHILD(n, 0)); |
| 794 if (!id) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
795 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
|
796 e = Name(id, Load, lineno, col_offset, c->c_arena); |
| 35742 | 797 if (!e) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
798 return NULL; |
| 35742 | 799 |
| 800 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
|
801 id = NEW_IDENTIFIER(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
802 if (!id) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
803 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
804 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
|
805 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
806 return NULL; |
| 35742 | 807 } |
| 808 | |
| 809 return e; | |
| 810 } | |
| 811 | |
| 812 static expr_ty | |
| 813 ast_for_decorator(struct compiling *c, const node *n) | |
| 814 { | |
| 815 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ | |
| 816 expr_ty d = NULL; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
817 expr_ty name_expr; |
| 35742 | 818 |
| 819 REQ(n, decorator); | |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
820 REQ(CHILD(n, 0), AT); |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
821 REQ(RCHILD(n, -1), NEWLINE); |
| 35742 | 822 |
| 823 name_expr = ast_for_dotted_name(c, CHILD(n, 1)); | |
| 824 if (!name_expr) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
825 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
826 |
| 35742 | 827 if (NCH(n) == 3) { /* No arguments */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
828 d = name_expr; |
|
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 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
|
832 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
|
833 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
834 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
835 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
836 name_expr = NULL; |
| 35742 | 837 } |
| 838 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
839 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
|
840 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
841 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
842 name_expr = NULL; |
| 35742 | 843 } |
| 844 | |
| 845 return d; | |
| 846 } | |
| 847 | |
| 848 static asdl_seq* | |
| 849 ast_for_decorators(struct compiling *c, const node *n) | |
| 850 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
851 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
|
852 expr_ty d; |
| 35742 | 853 int i; |
| 854 | |
| 855 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
|
856 decorator_seq = asdl_seq_new(NCH(n), c->c_arena); |
| 35742 | 857 if (!decorator_seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
858 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
859 |
| 35742 | 860 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
|
861 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
|
862 if (!d) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
863 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
864 asdl_seq_SET(decorator_seq, i, d); |
| 35742 | 865 } |
| 866 return decorator_seq; | |
| 867 } | |
| 868 | |
| 869 static stmt_ty | |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
870 ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 871 { |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
872 /* funcdef: 'def' NAME parameters ':' suite */ |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
873 identifier name; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
874 arguments_ty args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
875 asdl_seq *body; |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
876 int name_i = 1; |
| 35742 | 877 |
| 878 REQ(n, funcdef); | |
| 879 | |
| 880 name = NEW_IDENTIFIER(CHILD(n, name_i)); | |
| 881 if (!name) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
882 return NULL; |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
883 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
|
884 return NULL; |
| 35742 | 885 args = ast_for_arguments(c, CHILD(n, name_i + 1)); |
| 886 if (!args) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
887 return NULL; |
| 35742 | 888 body = ast_for_suite(c, CHILD(n, name_i + 3)); |
| 889 if (!body) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
890 return NULL; |
| 35742 | 891 |
|
37453
16a64e394602
Add lineno, col_offset to excephandler to enable future fix for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
37235
diff
changeset
|
892 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
|
893 n->n_col_offset, c->c_arena); |
| 35742 | 894 } |
| 895 | |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
896 static stmt_ty |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
897 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
|
898 { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
899 /* decorated: decorators (classdef | funcdef) */ |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
900 stmt_ty thing = NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
901 asdl_seq *decorator_seq = NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
902 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
903 REQ(n, decorated); |
|
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 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
|
906 if (!decorator_seq) |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
907 return NULL; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
908 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
909 assert(TYPE(CHILD(n, 1)) == funcdef || |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
910 TYPE(CHILD(n, 1)) == classdef); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
911 |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
912 if (TYPE(CHILD(n, 1)) == funcdef) { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
913 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
|
914 } 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
|
915 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
|
916 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
917 /* 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
|
918 function's line number */ |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
919 if (thing) { |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
920 thing->lineno = LINENO(n); |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
921 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
|
922 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
923 return thing; |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
924 } |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
925 |
| 35742 | 926 static expr_ty |
| 927 ast_for_lambdef(struct compiling *c, const node *n) | |
| 928 { | |
| 929 /* lambdef: 'lambda' [varargslist] ':' test */ | |
| 930 arguments_ty args; | |
| 931 expr_ty expression; | |
| 932 | |
| 933 if (NCH(n) == 3) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
934 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
|
935 if (!args) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
936 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
937 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
|
938 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
939 return NULL; |
| 35742 | 940 } |
| 941 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
942 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
|
943 if (!args) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
944 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
945 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
|
946 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
947 return NULL; |
| 35742 | 948 } |
| 949 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
950 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 951 } |
| 952 | |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
953 static expr_ty |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
954 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
|
955 { |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
956 /* 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
|
957 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
|
958 |
|
36676
67c74efad8c2
Fix old not-reading-pep-308-right artifact.
Thomas Wouters <thomas@python.org>
parents:
36670
diff
changeset
|
959 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
|
960 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
|
961 if (!body) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
962 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
963 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
|
964 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
965 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
966 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
|
967 if (!orelse) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
968 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
|
969 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
|
970 c->c_arena); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
971 } |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
972 |
|
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
|
973 /* 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
|
974 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
|
975 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
|
976 */ |
|
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
|
977 |
| 35742 | 978 /* Count the number of 'for' loop in a list comprehension. |
| 979 | |
| 980 Helper for ast_for_listcomp(). | |
| 981 */ | |
| 982 | |
| 983 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
|
984 count_list_fors(struct compiling *c, const node *n) |
| 35742 | 985 { |
| 986 int n_fors = 0; | |
| 987 node *ch = CHILD(n, 1); | |
| 988 | |
| 989 count_list_for: | |
| 990 n_fors++; | |
| 991 REQ(ch, list_for); | |
| 992 if (NCH(ch) == 5) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
993 ch = CHILD(ch, 4); |
| 35742 | 994 else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
995 return n_fors; |
| 35742 | 996 count_list_iter: |
| 997 REQ(ch, list_iter); | |
| 998 ch = CHILD(ch, 0); | |
| 999 if (TYPE(ch) == list_for) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1000 goto count_list_for; |
| 35742 | 1001 else if (TYPE(ch) == list_if) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1002 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1003 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1004 goto count_list_iter; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1005 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1006 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1007 return n_fors; |
| 35742 | 1008 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1009 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1010 /* Should never be reached */ |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1011 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
|
1012 return -1; |
| 35742 | 1013 } |
| 1014 | |
| 1015 /* Count the number of 'if' statements in a list comprehension. | |
| 1016 | |
| 1017 Helper for ast_for_listcomp(). | |
| 1018 */ | |
| 1019 | |
| 1020 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
|
1021 count_list_ifs(struct compiling *c, const node *n) |
| 35742 | 1022 { |
| 1023 int n_ifs = 0; | |
| 1024 | |
| 1025 count_list_iter: | |
| 1026 REQ(n, list_iter); | |
| 1027 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
|
1028 return n_ifs; |
| 35742 | 1029 n = CHILD(n, 0); |
| 1030 REQ(n, list_if); | |
| 1031 n_ifs++; | |
| 1032 if (NCH(n) == 2) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1033 return n_ifs; |
| 35742 | 1034 n = CHILD(n, 2); |
| 1035 goto count_list_iter; | |
| 1036 } | |
| 1037 | |
| 1038 static expr_ty | |
| 1039 ast_for_listcomp(struct compiling *c, const node *n) | |
| 1040 { | |
| 1041 /* listmaker: test ( list_for | (',' test)* [','] ) | |
| 1042 list_for: 'for' exprlist 'in' testlist_safe [list_iter] | |
| 1043 list_iter: list_for | list_if | |
| 1044 list_if: 'if' test [list_iter] | |
| 1045 testlist_safe: test [(',' test)+ [',']] | |
| 1046 */ | |
| 1047 expr_ty elt; | |
| 1048 asdl_seq *listcomps; | |
| 1049 int i, n_fors; | |
| 1050 node *ch; | |
| 1051 | |
| 1052 REQ(n, listmaker); | |
| 1053 assert(NCH(n) > 1); | |
| 1054 | |
| 1055 elt = ast_for_expr(c, CHILD(n, 0)); | |
| 1056 if (!elt) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1057 return NULL; |
| 35742 | 1058 |
|
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
|
1059 n_fors = count_list_fors(c, n); |
| 35742 | 1060 if (n_fors == -1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1061 return NULL; |
| 35742 | 1062 |
|
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
|
1063 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
|
1064 if (!listcomps) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1065 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
|
1066 |
| 35742 | 1067 ch = CHILD(n, 1); |
| 1068 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
|
1069 comprehension_ty lc; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1070 asdl_seq *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1071 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1072 node *for_ch; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1073 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1074 REQ(ch, list_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1075 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1076 for_ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1077 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
|
1078 if (!t) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1079 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1080 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
|
1081 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1082 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1083 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1084 /* 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
|
1085 [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
|
1086 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1087 if (NCH(for_ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1088 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
|
1089 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1090 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1091 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
|
1092 c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1093 expression, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1094 if (!lc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1095 return NULL; |
| 35742 | 1096 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1097 if (NCH(ch) == 5) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1098 int j, n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1099 asdl_seq *ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1100 expr_ty list_for_expr; |
| 35742 | 1101 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1102 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
|
1103 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
|
1104 if (n_ifs == -1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1105 return NULL; |
| 35742 | 1106 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1107 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
|
1108 if (!ifs) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1109 return NULL; |
| 35742 | 1110 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1111 for (j = 0; j < n_ifs; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1112 REQ(ch, list_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1113 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1114 REQ(ch, list_if); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1115 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1116 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
|
1117 if (!list_for_expr) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1118 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1119 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1120 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
|
1121 if (NCH(ch) == 3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1122 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1123 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1124 /* 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
|
1125 if (TYPE(ch) == list_iter) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1126 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1127 lc->ifs = ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1128 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1129 asdl_seq_SET(listcomps, i, lc); |
| 35742 | 1130 } |
| 1131 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1132 return ListComp(elt, listcomps, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1133 } |
| 1134 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1135 /* Count the number of 'for' loops in a generator expression. |
| 35742 | 1136 |
| 1137 Helper for ast_for_genexp(). | |
| 1138 */ | |
| 1139 | |
| 1140 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
|
1141 count_gen_fors(struct compiling *c, const node *n) |
| 35742 | 1142 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1143 int n_fors = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1144 node *ch = CHILD(n, 1); |
| 35742 | 1145 |
| 1146 count_gen_for: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1147 n_fors++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1148 REQ(ch, gen_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1149 if (NCH(ch) == 5) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1150 ch = CHILD(ch, 4); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1151 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1152 return n_fors; |
| 35742 | 1153 count_gen_iter: |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1154 REQ(ch, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1155 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1156 if (TYPE(ch) == gen_for) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1157 goto count_gen_for; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1158 else if (TYPE(ch) == gen_if) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1159 if (NCH(ch) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1160 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1161 goto count_gen_iter; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1162 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1163 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1164 return n_fors; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1165 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1166 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1167 /* Should never be reached */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1168 PyErr_SetString(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1169 "logic error in count_gen_fors"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1170 return -1; |
| 35742 | 1171 } |
| 1172 | |
| 1173 /* Count the number of 'if' statements in a generator expression. | |
| 1174 | |
| 1175 Helper for ast_for_genexp(). | |
| 1176 */ | |
| 1177 | |
| 1178 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
|
1179 count_gen_ifs(struct compiling *c, const node *n) |
| 35742 | 1180 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1181 int n_ifs = 0; |
| 35742 | 1182 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1183 while (1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1184 REQ(n, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1185 if (TYPE(CHILD(n, 0)) == gen_for) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1186 return n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1187 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1188 REQ(n, gen_if); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1189 n_ifs++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1190 if (NCH(n) == 2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1191 return n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1192 n = CHILD(n, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1193 } |
| 35742 | 1194 } |
| 1195 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1196 /* TODO(jhylton): Combine with list comprehension code? */ |
| 35742 | 1197 static expr_ty |
| 1198 ast_for_genexp(struct compiling *c, const node *n) | |
| 1199 { | |
| 1200 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1201 argument: [test '='] test [gen_for] # Really [keyword '='] test */ |
| 35742 | 1202 expr_ty elt; |
| 1203 asdl_seq *genexps; | |
| 1204 int i, n_fors; | |
| 1205 node *ch; | |
| 1206 | |
| 1207 assert(TYPE(n) == (testlist_gexp) || TYPE(n) == (argument)); | |
| 1208 assert(NCH(n) > 1); | |
| 1209 | |
| 1210 elt = ast_for_expr(c, CHILD(n, 0)); | |
| 1211 if (!elt) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1212 return NULL; |
| 35742 | 1213 |
|
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
|
1214 n_fors = count_gen_fors(c, n); |
| 35742 | 1215 if (n_fors == -1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1216 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
|
1217 |
|
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
|
1218 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
|
1219 if (!genexps) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1220 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
|
1221 |
| 35742 | 1222 ch = CHILD(n, 1); |
| 1223 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
|
1224 comprehension_ty ge; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1225 asdl_seq *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1226 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1227 node *for_ch; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1228 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1229 REQ(ch, gen_for); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1230 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1231 for_ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1232 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
|
1233 if (!t) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1234 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1235 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
|
1236 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1237 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
|
1238 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1239 /* 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
|
1240 (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
|
1241 if (NCH(for_ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1242 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
|
1243 NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1244 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1245 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
|
1246 c->c_arena), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1247 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
|
1248 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1249 if (!ge) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1250 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
|
1251 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1252 if (NCH(ch) == 5) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1253 int j, n_ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1254 asdl_seq *ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1255 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1256 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
|
1257 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
|
1258 if (n_ifs == -1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1259 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
|
1260 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1261 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
|
1262 if (!ifs) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1263 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
|
1264 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1265 for (j = 0; j < n_ifs; j++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1266 REQ(ch, gen_iter); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1267 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1268 REQ(ch, gen_if); |
|
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 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
|
1271 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1272 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1273 asdl_seq_SET(ifs, j, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1274 if (NCH(ch) == 3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1275 ch = CHILD(ch, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1276 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1277 /* 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
|
1278 if (TYPE(ch) == gen_iter) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1279 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1280 ge->ifs = ifs; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1281 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1282 asdl_seq_SET(genexps, i, ge); |
| 35742 | 1283 } |
| 1284 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1285 return GeneratorExp(elt, genexps, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1286 } |
| 1287 | |
| 1288 static expr_ty | |
| 1289 ast_for_atom(struct compiling *c, const node *n) | |
| 1290 { | |
| 1291 /* atom: '(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | |
| 1292 | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+ | |
| 1293 */ | |
| 1294 node *ch = CHILD(n, 0); | |
| 1295 | |
| 1296 switch (TYPE(ch)) { | |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1297 case NAME: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1298 /* 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
|
1299 changed. */ |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1300 PyObject *name = NEW_IDENTIFIER(ch); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1301 if (!name) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1302 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1303 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1304 } |
| 35742 | 1305 case STRING: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1306 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
|
1307 if (!str) { |
|
44572
db5e01c33eb7
Make Python compile with --disable-unicode.
Georg Brandl <georg@python.org>
parents:
43997
diff
changeset
|
1308 #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
|
1309 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
|
1310 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
|
1311 PyErr_Fetch(&type, &value, &tback); |
|
49795
b64d053afd84
don't segfault when \N escapes are used and unicodedata fails to load
Benjamin Peterson <benjamin@python.org>
parents:
49696
diff
changeset
|
1312 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
|
1313 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
|
1314 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
|
1315 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
|
1316 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
|
1317 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
|
1318 ast_error(n, buf); |
|
49795
b64d053afd84
don't segfault when \N escapes are used and unicodedata fails to load
Benjamin Peterson <benjamin@python.org>
parents:
49696
diff
changeset
|
1319 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
|
1320 } else { |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1321 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
|
1322 } |
|
6775ee6d89d3
SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
Guido van Rossum <guido@python.org>
parents:
41974
diff
changeset
|
1323 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
|
1324 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
|
1325 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
|
1326 } |
|
44572
db5e01c33eb7
Make Python compile with --disable-unicode.
Georg Brandl <georg@python.org>
parents:
43997
diff
changeset
|
1327 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1328 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
|
1329 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1330 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1331 return Str(str, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1332 } |
| 1333 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
|
1334 PyObject *pynum = parsenumber(c, STR(ch)); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1335 if (!pynum) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1336 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
|
1337 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1338 PyArena_AddPyObject(c->c_arena, pynum); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1339 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1340 } |
| 1341 case LPAR: /* some parenthesized expressions */ | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1342 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1343 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1344 if (TYPE(ch) == RPAR) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1345 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
|
1346 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1347 if (TYPE(ch) == yield_expr) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1348 return ast_for_expr(c, ch); |
|
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 ((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
|
1351 return ast_for_genexp(c, ch); |
|
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 return ast_for_testlist_gexp(c, ch); |
| 35742 | 1354 case LSQB: /* list (or list comprehension) */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1355 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1356 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1357 if (TYPE(ch) == RSQB) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1358 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
|
1359 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1360 REQ(ch, listmaker); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1361 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
|
1362 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
|
1363 if (!elts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1364 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
|
1365 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1366 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
|
1367 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1368 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1369 return ast_for_listcomp(c, ch); |
| 35742 | 1370 case LBRACE: { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1371 /* dictmaker: test ':' test (',' test ':' test)* [','] */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1372 int i, size; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1373 asdl_seq *keys, *values; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1374 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1375 ch = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1376 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
|
1377 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
|
1378 if (!keys) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1379 return NULL; |
|
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 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
|
1382 if (!values) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1383 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1384 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1385 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
|
1386 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1387 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1388 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
|
1389 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1390 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
|
1391 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1392 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
|
1393 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1394 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
|
1395 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1396 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
|
1397 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1398 asdl_seq_SET(values, i / 4, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1399 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1400 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1401 } |
| 1402 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
|
1403 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
|
1404 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
|
1405 !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
|
1406 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
|
1407 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
|
1408 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1409 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
|
1410 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1411 return Repr(expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1412 } |
| 1413 default: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1414 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
|
1415 return NULL; |
| 35742 | 1416 } |
| 1417 } | |
| 1418 | |
| 1419 static slice_ty | |
| 1420 ast_for_slice(struct compiling *c, const node *n) | |
| 1421 { | |
| 1422 node *ch; | |
| 1423 expr_ty lower = NULL, upper = NULL, step = NULL; | |
| 1424 | |
| 1425 REQ(n, subscript); | |
| 1426 | |
| 1427 /* | |
| 1428 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] | |
| 1429 sliceop: ':' [test] | |
| 1430 */ | |
| 1431 ch = CHILD(n, 0); | |
| 1432 if (TYPE(ch) == DOT) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1433 return Ellipsis(c->c_arena); |
| 35742 | 1434 |
| 1435 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
|
1436 /* '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
|
1437 other vars */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1438 step = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1439 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1440 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1441 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1442 return Index(step, c->c_arena); |
| 35742 | 1443 } |
| 1444 | |
| 1445 if (TYPE(ch) == test) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1446 lower = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1447 if (!lower) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1448 return NULL; |
| 35742 | 1449 } |
| 1450 | |
| 1451 /* If there's an upper bound it's in the second or third position. */ | |
| 1452 if (TYPE(ch) == COLON) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1453 if (NCH(n) > 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1454 node *n2 = CHILD(n, 1); |
| 35742 | 1455 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1456 if (TYPE(n2) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1457 upper = ast_for_expr(c, n2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1458 if (!upper) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1459 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1460 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1461 } |
| 35742 | 1462 } else if (NCH(n) > 2) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1463 node *n2 = CHILD(n, 2); |
| 35742 | 1464 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1465 if (TYPE(n2) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1466 upper = ast_for_expr(c, n2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1467 if (!upper) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1468 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1469 } |
| 35742 | 1470 } |
| 1471 | |
| 1472 ch = CHILD(n, NCH(n) - 1); | |
| 1473 if (TYPE(ch) == sliceop) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1474 if (NCH(ch) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1475 /* No expression, so step is None */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1476 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1477 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
|
1478 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
|
1479 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1480 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1481 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1482 ch = CHILD(ch, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1483 if (TYPE(ch) == test) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1484 step = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1485 if (!step) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1486 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1487 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1488 } |
| 35742 | 1489 } |
| 1490 | |
|
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
|
1491 return Slice(lower, upper, step, c->c_arena); |
| 35742 | 1492 } |
| 1493 | |
| 1494 static expr_ty | |
| 1495 ast_for_binop(struct compiling *c, const node *n) | |
| 1496 { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1497 /* Must account for a sequence of expressions. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1498 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
|
1499 BinOp(BinOp(A, op, B), op, C). |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1500 */ |
| 35742 | 1501 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1502 int i, nops; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1503 expr_ty expr1, expr2, result; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1504 operator_ty newoperator; |
| 35742 | 1505 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1506 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
|
1507 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1508 return NULL; |
| 35742 | 1509 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1510 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
|
1511 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1512 return NULL; |
| 35742 | 1513 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1514 newoperator = get_operator(CHILD(n, 1)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1515 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1516 return NULL; |
| 35742 | 1517 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1518 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
|
1519 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1520 if (!result) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1521 return NULL; |
| 35742 | 1522 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1523 nops = (NCH(n) - 1) / 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1524 for (i = 1; i < nops; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1525 expr_ty tmp_result, tmp; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1526 const node* next_oper = CHILD(n, i * 2 + 1); |
| 35742 | 1527 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1528 newoperator = get_operator(next_oper); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1529 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1530 return NULL; |
| 35742 | 1531 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1532 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
|
1533 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1534 return NULL; |
| 35742 | 1535 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1536 tmp_result = BinOp(result, newoperator, tmp, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1537 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
|
1538 c->c_arena); |
|
43470
995677219a65
Fix Coverity #158: Check the correct variable.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42459
diff
changeset
|
1539 if (!tmp_result) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1540 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1541 result = tmp_result; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1542 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1543 return result; |
| 35742 | 1544 } |
| 1545 | |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1546 static expr_ty |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1547 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
|
1548 { |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1549 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1550 subscriptlist: subscript (',' subscript)* [','] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1551 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
1552 */ |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1553 REQ(n, trailer); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1554 if (TYPE(CHILD(n, 0)) == LPAR) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1555 if (NCH(n) == 2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1556 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
|
1557 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1558 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1559 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
|
1560 } |
|
36679
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
1561 else if (TYPE(CHILD(n, 0)) == DOT ) { |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1562 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1563 if (!attr_id) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1564 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
1565 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
|
1566 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
|
1567 } |
|
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
1568 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1569 REQ(CHILD(n, 0), LSQB); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1570 REQ(CHILD(n, 2), RSQB); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1571 n = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1572 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1573 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
|
1574 if (!slc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1575 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1576 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
|
1577 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1578 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1579 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1580 /* 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
|
1581 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
|
1582 no slice features. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1583 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1584 int j; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1585 slice_ty slc; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1586 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1587 bool simple = true; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1588 asdl_seq *slices, *elts; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1589 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
|
1590 if (!slices) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1591 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1592 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
|
1593 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
|
1594 if (!slc) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1595 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1596 if (slc->kind != Index_kind) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1597 simple = false; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1598 asdl_seq_SET(slices, j / 2, slc); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1599 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1600 if (!simple) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1601 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
|
1602 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
|
1603 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1604 /* 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
|
1605 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
|
1606 if (!elts) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1607 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1608 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
|
1609 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
|
1610 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
|
1611 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
|
1612 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1613 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
|
1614 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1615 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1616 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
|
1617 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
|
1618 } |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1619 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1620 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1621 |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1622 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
|
1623 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
|
1624 { |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1625 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
|
1626 expr_ty expression; |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1627 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1628 /* 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
|
1629 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
|
1630 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
|
1631 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
|
1632 (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
|
1633 PyLongObject. |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1634 */ |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1635 if (TYPE(CHILD(n, 0)) == MINUS && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1636 NCH(n) == 2 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1637 TYPE((pfactor = CHILD(n, 1))) == factor && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1638 NCH(pfactor) == 1 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1639 TYPE((ppower = CHILD(pfactor, 0))) == power && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1640 NCH(ppower) == 1 && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1641 TYPE((patom = CHILD(ppower, 0))) == atom && |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1642 TYPE((pnum = CHILD(patom, 0))) == NUMBER) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1643 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
|
1644 if (s == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1645 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1646 s[0] = '-'; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1647 strcpy(s + 1, STR(pnum)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1648 PyObject_FREE(STR(pnum)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1649 STR(pnum) = s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1650 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
|
1651 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1652 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1653 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
|
1654 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1655 return NULL; |
|
39038
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1656 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1657 switch (TYPE(CHILD(n, 0))) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1658 case PLUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1659 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
|
1660 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1661 case MINUS: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1662 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
|
1663 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1664 case TILDE: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1665 return UnaryOp(Invert, expression, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1666 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
|
1667 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1668 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
|
1669 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
|
1670 return NULL; |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1671 } |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1672 |
|
64ccd745ea92
Fix SF bug 1441486: bad unary minus folding in compiler.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
39037
diff
changeset
|
1673 static expr_ty |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1674 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
|
1675 { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1676 /* power: atom trailer* ('**' factor)* |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1677 */ |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1678 int i; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1679 expr_ty e, tmp; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1680 REQ(n, power); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1681 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
|
1682 if (!e) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1683 return NULL; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1684 if (NCH(n) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1685 return e; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1686 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
|
1687 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1688 if (TYPE(ch) != trailer) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1689 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1690 tmp = ast_for_trailer(c, ch, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1691 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1692 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1693 tmp->lineno = e->lineno; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1694 tmp->col_offset = e->col_offset; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1695 e = tmp; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1696 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1697 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
|
1698 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
|
1699 if (!f) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1700 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1701 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
|
1702 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1703 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1704 e = tmp; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1705 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1706 return e; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1707 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
1708 |
| 35742 | 1709 /* Do not name a variable 'expr'! Will cause a compile error. |
| 1710 */ | |
| 1711 | |
| 1712 static expr_ty | |
| 1713 ast_for_expr(struct compiling *c, const node *n) | |
| 1714 { | |
| 1715 /* 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
|
1716 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
|
1717 or_test: and_test ('or' and_test)* |
| 35742 | 1718 and_test: not_test ('and' not_test)* |
| 1719 not_test: 'not' not_test | comparison | |
| 1720 comparison: expr (comp_op expr)* | |
| 1721 expr: xor_expr ('|' xor_expr)* | |
| 1722 xor_expr: and_expr ('^' and_expr)* | |
| 1723 and_expr: shift_expr ('&' shift_expr)* | |
| 1724 shift_expr: arith_expr (('<<'|'>>') arith_expr)* | |
| 1725 arith_expr: term (('+'|'-') term)* | |
| 1726 term: factor (('*'|'/'|'%'|'//') factor)* | |
| 1727 factor: ('+'|'-'|'~') factor | power | |
| 1728 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
|
1729 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1730 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
|
1731 to explicitly allow: |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1732 [ 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
|
1733 (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
|
1734 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1735 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
|
1736 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
|
1737 |
| 35742 | 1738 */ |
| 1739 | |
| 1740 asdl_seq *seq; | |
| 1741 int i; | |
| 1742 | |
| 1743 loop: | |
| 1744 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1745 case test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1746 case old_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1747 if (TYPE(CHILD(n, 0)) == lambdef || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1748 TYPE(CHILD(n, 0)) == old_lambdef) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1749 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
|
1750 else if (NCH(n) > 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1751 return ast_for_ifexpr(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1752 /* Fallthrough */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1753 case or_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1754 case and_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1755 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1756 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1757 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1758 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1759 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
|
1760 if (!seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1761 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1762 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
|
1763 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
|
1764 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1765 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1766 asdl_seq_SET(seq, i / 2, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1767 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1768 if (!strcmp(STR(CHILD(n, 1)), "and")) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1769 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
|
1770 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1771 assert(!strcmp(STR(CHILD(n, 1)), "or")); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1772 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
|
1773 case not_test: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1774 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1775 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1776 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1777 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1778 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1779 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
|
1780 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1781 return NULL; |
| 35742 | 1782 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1783 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
|
1784 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1785 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1786 case comparison: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1787 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1788 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1789 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1790 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1791 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1792 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1793 asdl_int_seq *ops; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1794 asdl_seq *cmps; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1795 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
|
1796 if (!ops) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1797 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1798 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
|
1799 if (!cmps) { |
|
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 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1802 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
|
1803 cmpop_ty newoperator; |
| 35742 | 1804 |
|
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
|
1805 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
|
1806 if (!newoperator) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1807 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1808 } |
| 35742 | 1809 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1810 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
|
1811 if (!expression) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1812 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1813 } |
|
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 asdl_seq_SET(ops, i / 2, newoperator); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1816 asdl_seq_SET(cmps, i / 2, expression); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1817 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1818 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
|
1819 if (!expression) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1820 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1821 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1822 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1823 return Compare(expression, ops, cmps, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1824 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1825 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1826 break; |
| 35742 | 1827 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1828 /* 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
|
1829 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
|
1830 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
|
1831 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1832 case expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1833 case xor_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1834 case and_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1835 case shift_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1836 case arith_expr: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1837 case term: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1838 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1839 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1840 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1841 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1842 return ast_for_binop(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1843 case yield_expr: { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1844 expr_ty exp = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1845 if (NCH(n) == 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1846 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
|
1847 if (!exp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1848 return NULL; |
|
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 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
|
1851 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1852 case factor: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1853 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1854 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1855 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1856 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1857 return ast_for_factor(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1858 case power: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1859 return ast_for_power(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1860 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1861 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
|
1862 return NULL; |
| 35742 | 1863 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1864 /* should never get here unless if error is set */ |
| 35742 | 1865 return NULL; |
| 1866 } | |
| 1867 | |
| 1868 static expr_ty | |
| 1869 ast_for_call(struct compiling *c, const node *n, expr_ty func) | |
| 1870 { | |
| 1871 /* | |
| 1872 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1873 | '**' test) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1874 argument: [test '='] test [gen_for] # Really [keyword '='] test |
| 35742 | 1875 */ |
| 1876 | |
| 1877 int i, nargs, nkeywords, ngens; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1878 asdl_seq *args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1879 asdl_seq *keywords; |
| 35742 | 1880 expr_ty vararg = NULL, kwarg = NULL; |
| 1881 | |
| 1882 REQ(n, arglist); | |
| 1883 | |
| 1884 nargs = 0; | |
| 1885 nkeywords = 0; | |
| 1886 ngens = 0; | |
| 1887 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
|
1888 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1889 if (TYPE(ch) == argument) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1890 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1891 nargs++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1892 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
|
1893 ngens++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1894 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1895 nkeywords++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1896 } |
| 35742 | 1897 } |
| 1898 if (ngens > 1 || (ngens && (nargs || nkeywords))) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1899 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
|
1900 "if not sole argument"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1901 return NULL; |
| 35742 | 1902 } |
| 1903 | |
| 1904 if (nargs + nkeywords + ngens > 255) { | |
| 1905 ast_error(n, "more than 255 arguments"); | |
| 1906 return NULL; | |
| 1907 } | |
| 1908 | |
|
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
|
1909 args = asdl_seq_new(nargs + ngens, c->c_arena); |
| 35742 | 1910 if (!args) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1911 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
|
1912 keywords = asdl_seq_new(nkeywords, c->c_arena); |
| 35742 | 1913 if (!keywords) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1914 return NULL; |
| 35742 | 1915 nargs = 0; |
| 1916 nkeywords = 0; | |
| 1917 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
|
1918 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1919 if (TYPE(ch) == argument) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1920 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1921 if (NCH(ch) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1922 if (nkeywords) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1923 ast_error(CHILD(ch, 0), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1924 "non-keyword arg after keyword arg"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1925 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1926 } |
|
48307
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1927 if (vararg) { |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1928 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
|
1929 "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
|
1930 return NULL; |
|
49f52e285a64
allow keyword args to be passed in after *args #3473
Benjamin Peterson <benjamin@python.org>
parents:
47977
diff
changeset
|
1931 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1932 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
|
1933 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1934 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1935 asdl_seq_SET(args, nargs++, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1936 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1937 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
|
1938 e = ast_for_genexp(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1939 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1940 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1941 asdl_seq_SET(args, nargs++, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1942 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1943 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1944 keyword_ty kw; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1945 identifier key; |
|
47860
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1946 int k; |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1947 char *tmp; |
| 35742 | 1948 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1949 /* 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
|
1950 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
|
1951 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1952 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1953 /* 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
|
1954 * 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
|
1955 * 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
|
1956 * then is very confusing. |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1957 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1958 if (e->kind == Lambda_kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1959 ast_error(CHILD(ch, 0), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1960 "lambda cannot contain assignment"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1961 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1962 } else if (e->kind != Name_kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1963 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
|
1964 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1965 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1966 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
|
1967 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
|
1968 return NULL; |
|
47860
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1969 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
|
1970 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
|
1971 ((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
|
1972 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
|
1973 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
|
1974 return NULL; |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1975 } |
|
80109d4044cd
#3219 repeated keyword arguments aren't allowed in function calls anymore
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1976 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1977 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
|
1978 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1979 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1980 kw = keyword(key, e, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1981 if (!kw) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1982 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1983 asdl_seq_SET(keywords, nkeywords++, kw); |
|
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 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1986 else if (TYPE(ch) == STAR) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1987 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
|
1988 if (!vararg) |
|
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1989 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1990 i++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1991 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1992 else if (TYPE(ch) == DOUBLESTAR) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1993 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
|
1994 if (!kwarg) |
|
ff3e9aeaa692
Issue#2238: some syntax errors from *args or **kwargs expressions
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
45447
diff
changeset
|
1995 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1996 i++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
1997 } |
| 35742 | 1998 } |
| 1999 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2000 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
|
2001 func->col_offset, c->c_arena); |
| 35742 | 2002 } |
| 2003 | |
| 2004 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
|
2005 ast_for_testlist(struct compiling *c, const node* n) |
| 35742 | 2006 { |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2007 /* 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
|
2008 /* 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
|
2009 /* 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
|
2010 /* testlist1: test (',' test)* */ |
| 35742 | 2011 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
|
2012 if (TYPE(n) == testlist_gexp) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2013 if (NCH(n) > 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2014 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
|
2015 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2016 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2017 assert(TYPE(n) == testlist || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2018 TYPE(n) == testlist_safe || |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2019 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
|
2020 } |
| 35742 | 2021 if (NCH(n) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2022 return ast_for_expr(c, CHILD(n, 0)); |
| 35742 | 2023 else { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2024 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
|
2025 if (!tmp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2026 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2027 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2028 } |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2029 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2030 |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2031 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
|
2032 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
|
2033 { |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2034 /* 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
|
2035 /* 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
|
2036 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
|
2037 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
|
2038 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
|
2039 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
|
2040 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2041 |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2042 /* 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
|
2043 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
|
2044 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
|
2045 { |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2046 /* 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
|
2047 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
|
2048 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
|
2049 if (NCH(n) == 1) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2050 expr_ty base; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2051 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
|
2052 if (!bases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2053 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2054 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
|
2055 if (!base) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2056 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2057 asdl_seq_SET(bases, 0, base); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2058 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
|
2059 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2060 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2061 return seq_for_testlist(c, n); |
| 35742 | 2062 } |
| 2063 | |
| 2064 static stmt_ty | |
| 2065 ast_for_expr_stmt(struct compiling *c, const node *n) | |
| 2066 { | |
| 2067 REQ(n, expr_stmt); | |
| 2068 /* 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
|
2069 | ('=' (yield_expr|testlist))*) |
| 35742 | 2070 testlist: test (',' test)* [','] |
| 2071 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2072 | '<<=' | '>>=' | '**=' | '//=' |
| 35742 | 2073 test: ... here starts the operator precendence dance |
| 2074 */ | |
| 2075 | |
| 2076 if (NCH(n) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2077 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
|
2078 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2079 return NULL; |
| 35742 | 2080 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2081 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2082 } |
| 2083 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
|
2084 expr_ty expr1, expr2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2085 operator_ty newoperator; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2086 node *ch = CHILD(n, 0); |
| 35742 | 2087 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2088 expr1 = ast_for_testlist(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2089 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2090 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2091 /* 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
|
2092 switch (expr1->kind) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2093 case GeneratorExp_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2094 ast_error(ch, "augmented assignment to generator " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2095 "expression not possible"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2096 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2097 case Yield_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2098 ast_error(ch, "augmented assignment to yield " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2099 "expression not possible"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2100 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2101 case Name_kind: { |
|
47294
4fe192d48960
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46642
diff
changeset
|
2102 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
|
2103 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
|
2104 !forbidden_check(c, ch, var_name)) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2105 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2106 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2107 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2108 case Attribute_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2109 case Subscript_kind: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2110 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2111 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2112 ast_error(ch, "illegal expression for augmented " |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2113 "assignment"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2114 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2115 } |
|
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
|
2116 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
|
2117 return NULL; |
| 35742 | 2118 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2119 ch = CHILD(n, 2); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2120 if (TYPE(ch) == testlist) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2121 expr2 = ast_for_testlist(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2122 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2123 expr2 = ast_for_expr(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2124 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2125 return NULL; |
| 35742 | 2126 |
|
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
|
2127 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
|
2128 if (!newoperator) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2129 return NULL; |
| 35742 | 2130 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2131 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
|
2132 c->c_arena); |
| 35742 | 2133 } |
| 2134 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2135 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2136 asdl_seq *targets; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2137 node *value; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2138 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2139 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2140 /* a normal assignment */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2141 REQ(CHILD(n, 1), EQUAL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2142 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
|
2143 if (!targets) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2144 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2145 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
|
2146 expr_ty e; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2147 node *ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2148 if (TYPE(ch) == yield_expr) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2149 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
|
2150 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2151 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2152 e = ast_for_testlist(c, ch); |
| 35742 | 2153 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2154 /* set context to assign */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2155 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2156 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2157 |
|
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
|
2158 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
|
2159 return NULL; |
| 35742 | 2160 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2161 asdl_seq_SET(targets, i / 2, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2162 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2163 value = CHILD(n, NCH(n) - 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2164 if (TYPE(value) == testlist) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2165 expression = ast_for_testlist(c, value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2166 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2167 expression = ast_for_expr(c, value); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2168 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2169 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2170 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
|
2171 c->c_arena); |
| 35742 | 2172 } |
| 2173 } | |
| 2174 | |
| 2175 static stmt_ty | |
| 2176 ast_for_print_stmt(struct compiling *c, const node *n) | |
| 2177 { | |
| 2178 /* print_stmt: 'print' ( [ test (',' test)* [','] ] | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2179 | '>>' test [ (',' test)+ [','] ] ) |
| 35742 | 2180 */ |
| 2181 expr_ty dest = NULL, expression; | |
| 2182 asdl_seq *seq; | |
| 2183 bool nl; | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2184 int i, j, start = 1; |
| 35742 | 2185 |
| 2186 REQ(n, print_stmt); | |
| 2187 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
|
2188 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
|
2189 if (!dest) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2190 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2191 start = 4; |
| 35742 | 2192 } |
|
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
|
2193 seq = asdl_seq_new((NCH(n) + 1 - start) / 2, c->c_arena); |
| 35742 | 2194 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2195 return NULL; |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2196 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
|
2197 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
|
2198 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2199 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2200 asdl_seq_SET(seq, j, expression); |
| 35742 | 2201 } |
| 2202 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
|
2203 return Print(dest, seq, nl, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2204 } |
| 2205 | |
| 2206 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
|
2207 ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context) |
| 35742 | 2208 { |
| 2209 asdl_seq *seq; | |
| 2210 int i; | |
| 2211 expr_ty e; | |
| 2212 | |
| 2213 REQ(n, exprlist); | |
| 2214 | |
|
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
|
2215 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 2216 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2217 return NULL; |
| 35742 | 2218 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
|
2219 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
|
2220 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2221 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2222 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
|
2223 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
|
2224 return NULL; |
| 35742 | 2225 } |
| 2226 return seq; | |
| 2227 } | |
| 2228 | |
| 2229 static stmt_ty | |
| 2230 ast_for_del_stmt(struct compiling *c, const node *n) | |
| 2231 { | |
| 2232 asdl_seq *expr_list; | |
| 2233 | |
| 2234 /* del_stmt: 'del' exprlist */ | |
| 2235 REQ(n, del_stmt); | |
| 2236 | |
| 2237 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); | |
| 2238 if (!expr_list) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2239 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
|
2240 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2241 } |
| 2242 | |
| 2243 static stmt_ty | |
| 2244 ast_for_flow_stmt(struct compiling *c, const node *n) | |
| 2245 { | |
| 2246 /* | |
| 2247 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
|
2248 | yield_stmt |
| 35742 | 2249 break_stmt: 'break' |
| 2250 continue_stmt: 'continue' | |
| 2251 return_stmt: 'return' [testlist] | |
| 2252 yield_stmt: yield_expr | |
| 2253 yield_expr: 'yield' testlist | |
| 2254 raise_stmt: 'raise' [test [',' test [',' test]]] | |
| 2255 */ | |
| 2256 node *ch; | |
| 2257 | |
| 2258 REQ(n, flow_stmt); | |
| 2259 ch = CHILD(n, 0); | |
| 2260 switch (TYPE(ch)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2261 case break_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2262 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
|
2263 case continue_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2264 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
|
2265 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
|
2266 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
|
2267 if (!exp) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2268 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2269 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
|
2270 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2271 case return_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2272 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2273 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
|
2274 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2275 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
|
2276 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2277 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2278 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
|
2279 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2280 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2281 case raise_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2282 if (NCH(ch) == 1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2283 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
|
2284 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2285 else if (NCH(ch) == 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2286 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
|
2287 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2288 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2289 return Raise(expression, NULL, NULL, LINENO(n), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2290 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2291 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2292 else if (NCH(ch) == 4) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2293 expr_ty expr1, expr2; |
| 35742 | 2294 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2295 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
|
2296 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2297 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2298 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
|
2299 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2300 return NULL; |
| 35742 | 2301 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2302 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
|
2303 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2304 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2305 else if (NCH(ch) == 6) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2306 expr_ty expr1, expr2, expr3; |
| 35742 | 2307 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2308 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
|
2309 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2310 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2311 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
|
2312 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2313 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2314 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
|
2315 if (!expr3) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2316 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2317 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2318 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
|
2319 c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2320 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2321 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2322 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2323 "unexpected flow_stmt: %d", TYPE(ch)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2324 return NULL; |
| 35742 | 2325 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2326 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2327 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
|
2328 return NULL; |
| 35742 | 2329 } |
| 2330 | |
| 2331 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
|
2332 alias_for_import_name(struct compiling *c, const node *n) |
| 35742 | 2333 { |
| 2334 /* | |
|
36742
658f8ff2a442
Make 'as' an actual keyword when with's future statement is used. Not
Thomas Wouters <thomas@python.org>
parents:
36718
diff
changeset
|
2335 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
|
2336 dotted_as_name: dotted_name ['as' NAME] |
| 35742 | 2337 dotted_name: NAME ('.' NAME)* |
| 2338 */ | |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2339 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
|
2340 |
| 35742 | 2341 loop: |
| 2342 switch (TYPE(n)) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2343 case import_as_name: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2344 str = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2345 if (NCH(n) == 3) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2346 str = NEW_IDENTIFIER(CHILD(n, 2)); |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2347 if (!str) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2348 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2349 } |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2350 name = NEW_IDENTIFIER(CHILD(n, 0)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2351 if (!name) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2352 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2353 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
|
2354 case dotted_as_name: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2355 if (NCH(n) == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2356 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2357 goto loop; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2358 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2359 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2360 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
|
2361 if (!a) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2362 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2363 assert(!a->asname); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2364 a->asname = NEW_IDENTIFIER(CHILD(n, 2)); |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2365 if (!a->asname) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2366 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2367 return a; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2368 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2369 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2370 case dotted_name: |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2371 if (NCH(n) == 1) { |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2372 name = NEW_IDENTIFIER(CHILD(n, 0)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2373 if (!name) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2374 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2375 return alias(name, NULL, c->c_arena); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
2376 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2377 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2378 /* 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
|
2379 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2380 size_t len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2381 char *s; |
| 35742 | 2382 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2383 len = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2384 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
|
2385 /* 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
|
2386 len += strlen(STR(CHILD(n, i))) + 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2387 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
|
2388 str = PyString_FromStringAndSize(NULL, len); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2389 if (!str) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2390 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
|
2391 s = PyString_AS_STRING(str); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2392 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2393 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2394 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
|
2395 char *sch = STR(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2396 strcpy(s, STR(CHILD(n, i))); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2397 s += strlen(sch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2398 *s++ = '.'; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2399 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2400 --s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2401 *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
|
2402 PyString_InternInPlace(&str); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2403 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2404 return alias(str, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2405 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2406 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2407 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
|
2408 str = PyString_InternFromString("*"); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2409 PyArena_AddPyObject(c->c_arena, str); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2410 return alias(str, NULL, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2411 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2412 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2413 "unexpected import name: %d", TYPE(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2414 return NULL; |
| 35742 | 2415 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2416 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2417 PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); |
| 35742 | 2418 return NULL; |
| 2419 } | |
| 2420 | |
| 2421 static stmt_ty | |
| 2422 ast_for_import_stmt(struct compiling *c, const node *n) | |
| 2423 { | |
| 2424 /* | |
| 2425 import_stmt: import_name | import_from | |
| 2426 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
|
2427 import_from: 'from' ('.'* dotted_name | '.') 'import' |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2428 ('*' | '(' import_as_names ')' | import_as_names) |
| 35742 | 2429 */ |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2430 int lineno; |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2431 int col_offset; |
| 35742 | 2432 int i; |
| 2433 asdl_seq *aliases; | |
| 2434 | |
| 2435 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
|
2436 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
|
2437 col_offset = n->n_col_offset; |
| 35742 | 2438 n = CHILD(n, 0); |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2439 if (TYPE(n) == import_name) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2440 n = CHILD(n, 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2441 REQ(n, dotted_as_names); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2442 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
|
2443 if (!aliases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2444 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2445 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
|
2446 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
|
2447 if (!import_alias) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2448 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2449 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
|
2450 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2451 return Import(aliases, lineno, col_offset, c->c_arena); |
| 35742 | 2452 } |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2453 else if (TYPE(n) == import_from) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2454 int n_children; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2455 int idx, ndots = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2456 alias_ty mod = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2457 identifier modname; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2458 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2459 /* 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
|
2460 optional module name */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2461 for (idx = 1; idx < NCH(n); idx++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2462 if (TYPE(CHILD(n, idx)) == dotted_name) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2463 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
|
2464 idx++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2465 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2466 } else if (TYPE(CHILD(n, idx)) != DOT) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2467 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2468 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2469 ndots++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2470 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2471 idx++; /* skip over the 'import' keyword */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2472 switch (TYPE(CHILD(n, idx))) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2473 case STAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2474 /* from ... import * */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2475 n = CHILD(n, idx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2476 n_children = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2477 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2478 case LPAR: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2479 /* from ... import (x, y, z) */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2480 n = CHILD(n, idx + 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2481 n_children = NCH(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2482 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2483 case import_as_names: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2484 /* from ... import x, y, z */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2485 n = CHILD(n, idx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2486 n_children = NCH(n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2487 if (n_children % 2 == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2488 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
|
2489 " surrounding parentheses"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2490 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2491 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2492 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2493 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2494 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
|
2495 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2496 } |
| 35742 | 2497 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2498 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
|
2499 if (!aliases) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2500 return NULL; |
| 35742 | 2501 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2502 /* 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
|
2503 if (TYPE(n) == STAR) { |
|
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, n); |
|
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, 0, 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 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2510 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
|
2511 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
|
2512 if (!import_alias) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2513 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2514 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
|
2515 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2516 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2517 if (mod != NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2518 modname = mod->name; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2519 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2520 modname = new_identifier("", c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2521 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
|
2522 c->c_arena); |
| 35742 | 2523 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2524 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2525 "unknown import statement: starts with command '%s'", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2526 STR(CHILD(n, 0))); |
| 35742 | 2527 return NULL; |
| 2528 } | |
| 2529 | |
| 2530 static stmt_ty | |
| 2531 ast_for_global_stmt(struct compiling *c, const node *n) | |
| 2532 { | |
| 2533 /* global_stmt: 'global' NAME (',' NAME)* */ | |
| 2534 identifier name; | |
| 2535 asdl_seq *s; | |
| 2536 int i; | |
| 2537 | |
| 2538 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
|
2539 s = asdl_seq_new(NCH(n) / 2, c->c_arena); |
| 35742 | 2540 if (!s) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2541 return NULL; |
| 35742 | 2542 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
|
2543 name = NEW_IDENTIFIER(CHILD(n, i)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2544 if (!name) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2545 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2546 asdl_seq_SET(s, i / 2, name); |
| 35742 | 2547 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2548 return Global(s, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2549 } |
| 2550 | |
| 2551 static stmt_ty | |
| 2552 ast_for_exec_stmt(struct compiling *c, const node *n) | |
| 2553 { | |
| 2554 expr_ty expr1, globals = NULL, locals = NULL; | |
| 2555 int n_children = NCH(n); | |
| 2556 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
|
2557 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2558 "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
|
2559 n_children); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2560 return NULL; |
| 35742 | 2561 } |
| 2562 | |
| 2563 /* exec_stmt: 'exec' expr ['in' test [',' test]] */ | |
| 2564 REQ(n, exec_stmt); | |
| 2565 expr1 = ast_for_expr(c, CHILD(n, 1)); | |
| 2566 if (!expr1) | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2567 return NULL; |
| 35742 | 2568 if (n_children >= 4) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2569 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
|
2570 if (!globals) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2571 return NULL; |
| 35742 | 2572 } |
| 2573 if (n_children == 6) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2574 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
|
2575 if (!locals) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2576 return NULL; |
| 35742 | 2577 } |
| 2578 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2579 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
|
2580 c->c_arena); |
| 35742 | 2581 } |
| 2582 | |
| 2583 static stmt_ty | |
| 2584 ast_for_assert_stmt(struct compiling *c, const node *n) | |
| 2585 { | |
| 2586 /* assert_stmt: 'assert' test [',' test] */ | |
| 2587 REQ(n, assert_stmt); | |
| 2588 if (NCH(n) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2589 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
|
2590 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2591 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2592 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
|
2593 c->c_arena); |
| 35742 | 2594 } |
| 2595 else if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2596 expr_ty expr1, expr2; |
| 35742 | 2597 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2598 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
|
2599 if (!expr1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2600 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2601 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
|
2602 if (!expr2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2603 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2604 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2605 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2606 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2607 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2608 "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
|
2609 NCH(n)); |
| 35742 | 2610 return NULL; |
| 2611 } | |
| 2612 | |
| 2613 static asdl_seq * | |
| 2614 ast_for_suite(struct compiling *c, const node *n) | |
| 2615 { | |
| 2616 /* 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
|
2617 asdl_seq *seq; |
| 35742 | 2618 stmt_ty s; |
| 2619 int i, total, num, end, pos = 0; | |
| 2620 node *ch; | |
| 2621 | |
| 2622 REQ(n, suite); | |
| 2623 | |
| 2624 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
|
2625 seq = asdl_seq_new(total, c->c_arena); |
| 35742 | 2626 if (!seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2627 return NULL; |
| 35742 | 2628 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
|
2629 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2630 /* simple_stmt always ends with a NEWLINE, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2631 and may have a trailing SEMI |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2632 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2633 end = NCH(n) - 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2634 if (TYPE(CHILD(n, end - 1)) == SEMI) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2635 end--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2636 /* loop by 2 to skip semi-colons */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2637 for (i = 0; i < end; i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2638 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2639 s = ast_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2640 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2641 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2642 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2643 } |
| 35742 | 2644 } |
| 2645 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2646 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
|
2647 ch = CHILD(n, i); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2648 REQ(ch, stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2649 num = num_stmts(ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2650 if (num == 1) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2651 /* 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
|
2652 s = ast_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2653 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2654 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2655 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2656 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2657 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2658 int j; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2659 ch = CHILD(ch, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2660 REQ(ch, simple_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2661 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
|
2662 /* statement terminates with a semi-colon ';' */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2663 if (NCH(CHILD(ch, j)) == 0) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2664 assert((j + 1) == NCH(ch)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2665 break; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2666 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2667 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
|
2668 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2669 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2670 asdl_seq_SET(seq, pos++, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2671 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2672 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2673 } |
| 35742 | 2674 } |
| 2675 assert(pos == seq->size); | |
| 2676 return seq; | |
| 2677 } | |
| 2678 | |
| 2679 static stmt_ty | |
| 2680 ast_for_if_stmt(struct compiling *c, const node *n) | |
| 2681 { | |
| 2682 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)* | |
| 2683 ['else' ':' suite] | |
| 2684 */ | |
| 2685 char *s; | |
| 2686 | |
| 2687 REQ(n, if_stmt); | |
| 2688 | |
| 2689 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2690 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2691 asdl_seq *suite_seq; |
| 35742 | 2692 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2693 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
|
2694 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2695 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2696 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
|
2697 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2698 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2699 |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2700 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
|
2701 c->c_arena); |
| 35742 | 2702 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2703 |
| 35742 | 2704 s = STR(CHILD(n, 4)); |
| 2705 /* s[2], the third character in the string, will be | |
| 2706 's' for el_s_e, or | |
| 2707 'i' for el_i_f | |
| 2708 */ | |
| 2709 if (s[2] == 's') { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2710 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2711 asdl_seq *seq1, *seq2; |
| 35742 | 2712 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2713 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
|
2714 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2715 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2716 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
|
2717 if (!seq1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2718 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2719 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
|
2720 if (!seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2721 return NULL; |
| 35742 | 2722 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2723 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
|
2724 c->c_arena); |
| 35742 | 2725 } |
| 2726 else if (s[2] == 'i') { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2727 int i, n_elif, has_else = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2728 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2729 asdl_seq *suite_seq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2730 asdl_seq *orelse = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2731 n_elif = NCH(n) - 4; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2732 /* 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
|
2733 not fourth, child from the end. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2734 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
|
2735 && 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
|
2736 has_else = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2737 n_elif -= 3; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2738 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2739 n_elif /= 4; |
| 35742 | 2740 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2741 if (has_else) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2742 asdl_seq *suite_seq2; |
| 35742 | 2743 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2744 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
|
2745 if (!orelse) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2746 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2747 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
|
2748 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2749 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2750 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
|
2751 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2752 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2753 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
|
2754 if (!suite_seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2755 return NULL; |
| 35742 | 2756 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2757 asdl_seq_SET(orelse, 0, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2758 If(expression, suite_seq, suite_seq2, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2759 LINENO(CHILD(n, NCH(n) - 6)), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2760 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
|
2761 c->c_arena)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2762 /* 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
|
2763 n_elif--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2764 } |
| 35742 | 2765 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2766 for (i = 0; i < n_elif; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2767 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
|
2768 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
|
2769 if (!newobj) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2770 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2771 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
|
2772 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2773 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2774 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
|
2775 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2776 return NULL; |
| 35742 | 2777 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2778 asdl_seq_SET(newobj, 0, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2779 If(expression, suite_seq, orelse, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2780 LINENO(CHILD(n, off)), |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2781 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
|
2782 orelse = newobj; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2783 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2784 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
|
2785 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2786 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2787 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
|
2788 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2789 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2790 return If(expression, suite_seq, orelse, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2791 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2792 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2793 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2794 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2795 "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
|
2796 return NULL; |
| 35742 | 2797 } |
| 2798 | |
| 2799 static stmt_ty | |
| 2800 ast_for_while_stmt(struct compiling *c, const node *n) | |
| 2801 { | |
| 2802 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */ | |
| 2803 REQ(n, while_stmt); | |
| 2804 | |
| 2805 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2806 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2807 asdl_seq *suite_seq; |
| 35742 | 2808 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2809 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
|
2810 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2811 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2812 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
|
2813 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2814 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2815 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
|
2816 c->c_arena); |
| 35742 | 2817 } |
| 2818 else if (NCH(n) == 7) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2819 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2820 asdl_seq *seq1, *seq2; |
| 35742 | 2821 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2822 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
|
2823 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2824 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2825 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
|
2826 if (!seq1) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2827 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2828 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
|
2829 if (!seq2) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2830 return NULL; |
| 35742 | 2831 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2832 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
|
2833 c->c_arena); |
| 35742 | 2834 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2835 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2836 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2837 "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
|
2838 NCH(n)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2839 return NULL; |
| 35742 | 2840 } |
| 2841 | |
| 2842 static stmt_ty | |
| 2843 ast_for_for_stmt(struct compiling *c, const node *n) | |
| 2844 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2845 asdl_seq *_target, *seq = NULL, *suite_seq; |
| 35742 | 2846 expr_ty expression; |
| 2847 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
|
2848 const node *node_target; |
| 35742 | 2849 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ |
| 2850 REQ(n, for_stmt); | |
| 2851 | |
| 2852 if (NCH(n) == 9) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2853 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
|
2854 if (!seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2855 return NULL; |
| 35742 | 2856 } |
| 2857 | |
|
39067
7182c2775c1e
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
Neal Norwitz <nnorwitz@gmail.com>
parents:
39038
diff
changeset
|
2858 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
|
2859 _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
|
2860 if (!_target) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2861 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
|
2862 /* 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
|
2863 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
|
2864 if (NCH(node_target) == 1) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2865 target = (expr_ty)asdl_seq_GET(_target, 0); |
| 35742 | 2866 else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2867 target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2868 |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2869 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
|
2870 if (!expression) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2871 return NULL; |
| 35742 | 2872 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
|
2873 if (!suite_seq) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2874 return NULL; |
| 35742 | 2875 |
|
37453
16a64e394602
Add lineno, col_offset to excephandler to enable future fix for
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
37235
diff
changeset
|
2876 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
|
2877 c->c_arena); |
| 35742 | 2878 } |
| 2879 | |
| 2880 static excepthandler_ty | |
| 2881 ast_for_except_clause(struct compiling *c, const node *exc, node *body) | |
| 2882 { | |
|
41773
f19e631be101
Backport PEP 3110's new 'except' syntax to 2.6.
Collin Winter <collinw@gmail.com>
parents:
41579
diff
changeset
|
2883 /* except_clause: 'except' [test [(',' | 'as') test]] */ |
| 35742 | 2884 REQ(exc, except_clause); |
| 2885 REQ(body, suite); | |
| 2886 | |
| 2887 if (NCH(exc) == 1) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2888 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
|
2889 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2890 return NULL; |
| 35742 | 2891 |
|
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
|
2892 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
|
2893 exc->n_col_offset, c->c_arena); |
| 35742 | 2894 } |
| 2895 else if (NCH(exc) == 2) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2896 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2897 asdl_seq *suite_seq; |
| 35742 | 2898 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2899 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
|
2900 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2901 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2902 suite_seq = ast_for_suite(c, body); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2903 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2904 return NULL; |
| 35742 | 2905 |
|
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
|
2906 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
|
2907 exc->n_col_offset, c->c_arena); |
| 35742 | 2908 } |
| 2909 else if (NCH(exc) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2910 asdl_seq *suite_seq; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2911 expr_ty expression; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2912 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
|
2913 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2914 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
|
2915 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
|
2916 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2917 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
|
2918 if (!expression) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2919 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2920 suite_seq = ast_for_suite(c, body); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2921 if (!suite_seq) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2922 return NULL; |
| 35742 | 2923 |
|
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
|
2924 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
|
2925 exc->n_col_offset, c->c_arena); |
| 35742 | 2926 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2927 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2928 PyErr_Format(PyExc_SystemError, |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2929 "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
|
2930 NCH(exc)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2931 return NULL; |
| 35742 | 2932 } |
| 2933 | |
| 2934 static stmt_ty | |
| 2935 ast_for_try_stmt(struct compiling *c, const node *n) | |
| 2936 { | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2937 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
|
2938 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
|
2939 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
|
2940 |
| 35742 | 2941 REQ(n, try_stmt); |
| 2942 | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2943 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
|
2944 if (body == NULL) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2945 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
|
2946 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2947 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
|
2948 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
|
2949 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
|
2950 /* we can assume it's an "else", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2951 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
|
2952 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
|
2953 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
|
2954 if (orelse == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2955 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2956 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2957 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2958 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2959 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
|
2960 if (finally == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2961 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2962 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2963 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2964 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2965 /* we can assume it's an "else", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2966 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
|
2967 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
|
2968 if (orelse == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2969 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2970 n_except--; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2971 } |
| 35742 | 2972 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2973 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
|
2974 ast_error(n, "malformed 'try' statement"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2975 return NULL; |
| 35742 | 2976 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2977 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2978 if (n_except > 0) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2979 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2980 stmt_ty except_st; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2981 /* 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
|
2982 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
|
2983 if (handlers == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2984 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
|
2985 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2986 for (i = 0; i < n_except; i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2987 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
|
2988 CHILD(n, 5 + i * 3)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2989 if (!e) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2990 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2991 asdl_seq_SET(handlers, i, e); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2992 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
2993 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2994 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
|
2995 n->n_col_offset, c->c_arena); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2996 if (!finally) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2997 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
|
2998 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
2999 /* 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
|
3000 TryFinally to emulate try ... except ... finally */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3001 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
|
3002 if (body == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3003 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3004 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
|
3005 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3006 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3007 /* 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
|
3008 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
|
3009 return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3010 } |
| 3011 | |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3012 static expr_ty |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3013 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
|
3014 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3015 REQ(n, with_var); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3016 return ast_for_expr(c, CHILD(n, 1)); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3017 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3018 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3019 /* with_stmt: 'with' test [ with_var ] ':' suite */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3020 static stmt_ty |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3021 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
|
3022 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3023 expr_ty context_expr, optional_vars = NULL; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3024 int suite_index = 3; /* skip 'with', test, and ':' */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3025 asdl_seq *suite_seq; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3026 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3027 assert(TYPE(n) == with_stmt); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3028 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
|
3029 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
|
3030 return NULL; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3031 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
|
3032 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
|
3033 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3034 if (!optional_vars) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3035 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3036 } |
|
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
|
3037 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
|
3038 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3039 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3040 suite_index = 4; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3041 } |
|
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 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
|
3044 if (!suite_seq) { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3045 return NULL; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3046 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
3047 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
|
3048 n->n_col_offset, c->c_arena); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3049 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3050 |
| 35742 | 3051 static stmt_ty |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3052 ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 3053 { |
| 3054 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */ | |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3055 PyObject *classname; |
| 35742 | 3056 asdl_seq *bases, *s; |
| 3057 | |
| 3058 REQ(n, classdef); | |
| 3059 | |
|
47523
d56450db60a2
Warn about assigning to Py3k keywords (True and False)
Benjamin Peterson <benjamin@python.org>
parents:
47521
diff
changeset
|
3060 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
|
3061 return NULL; |
| 35742 | 3062 |
| 3063 if (NCH(n) == 4) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3064 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
|
3065 if (!s) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3066 return NULL; |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3067 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3068 if (!classname) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3069 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3070 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n), |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3071 n->n_col_offset, c->c_arena); |
| 35742 | 3072 } |
| 3073 /* check for empty base list */ | |
| 3074 if (TYPE(CHILD(n,3)) == RPAR) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3075 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
|
3076 if (!s) |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3077 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3078 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3079 if (!classname) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3080 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3081 return ClassDef(classname, NULL, s, decorator_seq, LINENO(n), |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3082 n->n_col_offset, c->c_arena); |
| 35742 | 3083 } |
| 3084 | |
| 3085 /* 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
|
3086 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
|
3087 if (!bases) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3088 return NULL; |
| 35742 | 3089 |
| 3090 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
|
3091 if (!s) |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3092 return NULL; |
|
49842
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3093 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3094 if (!classname) |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3095 return NULL; |
|
ffad6c0f252e
always check the return value of NEW_IDENTIFIER
Benjamin Peterson <benjamin@python.org>
parents:
49795
diff
changeset
|
3096 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
|
3097 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3098 } |
| 3099 | |
| 3100 static stmt_ty | |
| 3101 ast_for_stmt(struct compiling *c, const node *n) | |
| 3102 { | |
| 3103 if (TYPE(n) == stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3104 assert(NCH(n) == 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3105 n = CHILD(n, 0); |
| 35742 | 3106 } |
| 3107 if (TYPE(n) == simple_stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3108 assert(num_stmts(n) == 1); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3109 n = CHILD(n, 0); |
| 35742 | 3110 } |
| 3111 if (TYPE(n) == small_stmt) { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3112 REQ(n, small_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3113 n = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3114 /* 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
|
3115 | 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
|
3116 | assert_stmt |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3117 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3118 switch (TYPE(n)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3119 case expr_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3120 return ast_for_expr_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3121 case print_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3122 return ast_for_print_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3123 case del_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3124 return ast_for_del_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3125 case pass_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3126 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
|
3127 case flow_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3128 return ast_for_flow_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3129 case import_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3130 return ast_for_import_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3131 case global_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3132 return ast_for_global_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3133 case exec_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3134 return ast_for_exec_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3135 case assert_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3136 return ast_for_assert_stmt(c, n); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3137 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3138 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3139 "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
|
3140 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3141 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3142 } |
| 35742 | 3143 } |
| 3144 else { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3145 /* 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
|
3146 | funcdef | classdef | decorated |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3147 */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3148 node *ch = CHILD(n, 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3149 REQ(n, compound_stmt); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3150 switch (TYPE(ch)) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3151 case if_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3152 return ast_for_if_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3153 case while_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3154 return ast_for_while_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3155 case for_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3156 return ast_for_for_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3157 case try_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3158 return ast_for_try_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3159 case with_stmt: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3160 return ast_for_with_stmt(c, ch); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3161 case funcdef: |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3162 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
|
3163 case classdef: |
|
45447
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3164 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
|
3165 case decorated: |
|
393822f2ef90
Patch #1759: Backport of PEP 3129 class decorators
Christian Heimes <christian@cheimes.de>
parents:
44747
diff
changeset
|
3166 return ast_for_decorated(c, ch); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3167 default: |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3168 PyErr_Format(PyExc_SystemError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3169 "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
|
3170 TYPE(n), NCH(n)); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3171 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3172 } |
| 35742 | 3173 } |
| 3174 } | |
| 3175 | |
| 3176 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
|
3177 parsenumber(struct compiling *c, const char *s) |
| 35742 | 3178 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3179 const char *end; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3180 long x; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3181 double dx; |
| 35742 | 3182 #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
|
3183 Py_complex complex; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3184 int imflag; |
| 35742 | 3185 #endif |
| 3186 | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3187 errno = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3188 end = s + strlen(s) - 1; |
| 35742 | 3189 #ifndef WITHOUT_COMPLEX |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3190 imflag = *end == 'j' || *end == 'J'; |
| 35742 | 3191 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3192 if (*end == 'l' || *end == 'L') |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3193 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
|
3194 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
|
3195 if (*end == '\0') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3196 if (errno != 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3197 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
|
3198 return PyInt_FromLong(x); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3199 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3200 /* XXX Huge floats may silently fail */ |
| 35742 | 3201 #ifndef WITHOUT_COMPLEX |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3202 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
|
3203 complex.real = 0.; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3204 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
|
3205 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
|
3206 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
|
3207 return PyComplex_FromCComplex(complex); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3208 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3209 else |
| 35742 | 3210 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3211 { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3212 PyFPE_START_PROTECT("atof", return 0) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3213 dx = PyOS_ascii_atof(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3214 PyFPE_END_PROTECT(dx) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3215 return PyFloat_FromDouble(dx); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3216 } |
| 35742 | 3217 } |
| 3218 | |
| 3219 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
|
3220 decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding) |
| 35742 | 3221 { |
| 3222 #ifndef Py_USING_UNICODE | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3223 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
|
3224 return NULL; |
| 35742 | 3225 #else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3226 PyObject *u, *v; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3227 char *s, *t; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3228 t = s = (char *)*sPtr; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3229 /* 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
|
3230 while (s < end && (*s & 0x80)) s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3231 *sPtr = s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3232 u = PyUnicode_DecodeUTF8(t, s - t, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3233 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3234 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3235 v = PyUnicode_AsEncodedString(u, encoding, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3236 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3237 return v; |
| 35742 | 3238 #endif |
| 3239 } | |
| 3240 | |
|
42459
dbfc3cf1522d
Place #ifdef Py_USING_UNICODE around decode_unicode().
Georg Brandl <georg@python.org>
parents:
42308
diff
changeset
|
3241 #ifdef Py_USING_UNICODE |
| 35742 | 3242 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
|
3243 decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding) |
| 35742 | 3244 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3245 PyObject *v, *u; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3246 char *buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3247 char *p; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3248 const char *end; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3249 if (encoding == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3250 buf = (char *)s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3251 u = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3252 } 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
|
3253 buf = (char *)s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3254 u = NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3255 } else { |
|
47587
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
3256 /* check for integer overflow */ |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
3257 if (len > PY_SIZE_MAX / 4) |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
3258 return NULL; |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3259 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3260 u = PyString_FromStringAndSize((char *)NULL, len * 4); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3261 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3262 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
|
3263 p = buf = PyString_AsString(u); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3264 end = s + len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3265 while (s < end) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3266 if (*s == '\\') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3267 *p++ = *s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3268 if (*s & 0x80) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3269 strcpy(p, "u005c"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3270 p += 5; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3271 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3272 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3273 if (*s & 0x80) { /* XXX inefficient */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3274 PyObject *w; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3275 char *r; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3276 Py_ssize_t rn, 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
|
3277 w = decode_utf8(c, &s, end, "utf-16-be"); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3278 if (w == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3279 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3280 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3281 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3282 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
|
3283 rn = PyString_Size(w); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3284 assert(rn % 2 == 0); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3285 for (i = 0; i < rn; i += 2) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3286 sprintf(p, "\\u%02x%02x", |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3287 r[i + 0] & 0xFF, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3288 r[i + 1] & 0xFF); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3289 p += 6; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3290 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3291 Py_DECREF(w); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3292 } else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3293 *p++ = *s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3294 } |
|
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 len = p - buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3297 s = buf; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3298 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3299 if (rawmode) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3300 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3301 else |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3302 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3303 Py_XDECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3304 return v; |
| 35742 | 3305 } |
|
42459
dbfc3cf1522d
Place #ifdef Py_USING_UNICODE around decode_unicode().
Georg Brandl <georg@python.org>
parents:
42308
diff
changeset
|
3306 #endif |
| 35742 | 3307 |
| 3308 /* s is a Python string literal, including the bracketing quote characters, | |
| 3309 * and r &/or u prefixes (if any), and embedded escape sequences (if any). | |
| 3310 * parsestr parses it, and returns the decoded Python string object. | |
| 3311 */ | |
| 3312 static PyObject * | |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3313 parsestr(struct compiling *c, const char *s) |
| 35742 | 3314 { |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3315 size_t len; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3316 int quote = Py_CHARMASK(*s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3317 int rawmode = 0; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3318 int need_encoding; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3319 int unicode = c->c_future_unicode; |
| 35742 | 3320 |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3321 if (isalpha(quote) || quote == '_') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3322 if (quote == 'u' || quote == 'U') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3323 quote = *++s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3324 unicode = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3325 } |
|
44747
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3326 if (quote == 'b' || quote == 'B') { |
|
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3327 quote = *++s; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3328 unicode = 0; |
|
44747
8da9ebf73026
Added bytes and b'' as aliases for str and ''
Christian Heimes <christian@cheimes.de>
parents:
44572
diff
changeset
|
3329 } |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3330 if (quote == 'r' || quote == 'R') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3331 quote = *++s; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3332 rawmode = 1; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3333 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3334 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3335 if (quote != '\'' && quote != '\"') { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3336 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3337 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3338 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3339 s++; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3340 len = strlen(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3341 if (len > INT_MAX) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3342 PyErr_SetString(PyExc_OverflowError, |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3343 "string to parse is too long"); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3344 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3345 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3346 if (s[--len] != quote) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3347 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3348 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3349 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3350 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
|
3351 s += 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3352 len -= 2; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3353 if (s[--len] != quote || s[--len] != quote) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3354 PyErr_BadInternalCall(); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3355 return NULL; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3356 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3357 } |
| 35742 | 3358 #ifdef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3359 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
|
3360 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
|
3361 } |
| 35742 | 3362 #endif |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3363 need_encoding = (c->c_encoding != NULL && |
|
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3364 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
|
3365 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
|
3366 if (rawmode || strchr(s, '\\') == NULL) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3367 if (need_encoding) { |
| 35742 | 3368 #ifndef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3369 /* 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
|
3370 encoding. */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3371 Py_FatalError( |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3372 "cannot deal with encodings in this build."); |
| 35742 | 3373 #else |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3374 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
|
3375 if (u == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3376 return NULL; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3377 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
|
3378 Py_DECREF(u); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3379 return v; |
| 35742 | 3380 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3381 } else { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3382 return PyString_FromStringAndSize(s, len); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3383 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3384 } |
| 35742 | 3385 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47524
diff
changeset
|
3386 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
|
3387 need_encoding ? c->c_encoding : NULL); |
| 35742 | 3388 } |
| 3389 | |
| 3390 /* Build a Python string object out of a STRING atom. This takes care of | |
| 3391 * compile-time literal catenation, calling parsestr() on each piece, and | |
| 3392 * pasting the intermediate results together. | |
| 3393 */ | |
| 3394 static PyObject * | |
| 3395 parsestrplus(struct compiling *c, const node *n) | |
| 3396 { | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3397 PyObject *v; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3398 int i; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3399 REQ(CHILD(n, 0), STRING); |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3400 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
|
3401 /* String literal concatenation */ |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3402 for (i = 1; i < NCH(n); i++) { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3403 PyObject *s; |
|
46118
c78d3586c474
Patch #2477: Added from __future__ import unicode_literals
Christian Heimes <christian@cheimes.de>
parents:
46075
diff
changeset
|
3404 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
|
3405 if (s == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3406 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
|
3407 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
|
3408 PyString_ConcatAndDel(&v, s); |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3409 if (v == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3410 goto onError; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3411 } |
| 35742 | 3412 #ifdef Py_USING_UNICODE |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3413 else { |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3414 PyObject *temp = PyUnicode_Concat(v, s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3415 Py_DECREF(s); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3416 Py_DECREF(v); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3417 v = temp; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3418 if (v == NULL) |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3419 goto onError; |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3420 } |
| 35742 | 3421 #endif |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3422 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3423 } |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3424 return v; |
| 35742 | 3425 |
| 3426 onError: | |
|
41215
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3427 Py_XDECREF(v); |
|
72da48d96257
Clean up formatting of this file.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
41205
diff
changeset
|
3428 return NULL; |
| 35742 | 3429 } |
