Mercurial > cpython-lru_cache-weakref
annotate Python/ast.c @ 80589:ffb2fa900cb7 3.3
Issue #16546: make ast.YieldFrom argument mandatory.
| author | Mark Dickinson <mdickinson@enthought.com> |
|---|---|
| date | Sun, 25 Nov 2012 14:36:26 +0000 |
| parents | 2c9f1a578861 |
| children | c08bcf5302ec 03f92a9f0875 |
| rev | line source |
|---|---|
| 35742 | 1 /* |
| 2 * This file includes functions to transform a concrete syntax tree (CST) to | |
|
71795
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
3 * an abstract syntax tree (AST). The main function is PyAST_FromNode(). |
| 35742 | 4 * |
| 5 */ | |
| 6 #include "Python.h" | |
| 7 #include "Python-ast.h" | |
| 8 #include "node.h" | |
| 9 #include "ast.h" | |
| 10 #include "token.h" | |
|
71795
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
11 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
12 #include <assert.h> |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
13 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
14 static int validate_stmts(asdl_seq *); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
15 static int validate_exprs(asdl_seq *, expr_context_ty, int); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
16 static int validate_nonempty_seq(asdl_seq *, const char *, const char *); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
17 static int validate_stmt(stmt_ty); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
18 static int validate_expr(expr_ty, expr_context_ty); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
19 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
20 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
21 validate_comprehension(asdl_seq *gens) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
22 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
23 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
24 if (!asdl_seq_LEN(gens)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
25 PyErr_SetString(PyExc_ValueError, "comprehension with no generators"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
26 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
27 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
28 for (i = 0; i < asdl_seq_LEN(gens); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
29 comprehension_ty comp = asdl_seq_GET(gens, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
30 if (!validate_expr(comp->target, Store) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
31 !validate_expr(comp->iter, Load) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
32 !validate_exprs(comp->ifs, Load, 0)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
33 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
34 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
35 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
36 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
37 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
38 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
39 validate_slice(slice_ty slice) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
40 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
41 switch (slice->kind) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
42 case Slice_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
43 return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
44 (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
45 (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
46 case ExtSlice_kind: { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
47 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
48 if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice")) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
49 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
50 for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
51 if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i))) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
52 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
53 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
54 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
55 case Index_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
56 return validate_expr(slice->v.Index.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
57 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
58 PyErr_SetString(PyExc_SystemError, "unknown slice node"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
59 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
60 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
61 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
62 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
63 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
64 validate_keywords(asdl_seq *keywords) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
65 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
66 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
67 for (i = 0; i < asdl_seq_LEN(keywords); i++) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
68 if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
69 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
70 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
71 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
72 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
73 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
74 validate_args(asdl_seq *args) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
75 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
76 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
77 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
78 arg_ty arg = asdl_seq_GET(args, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
79 if (arg->annotation && !validate_expr(arg->annotation, Load)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
80 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
81 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
82 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
83 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
84 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
85 static const char * |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
86 expr_context_name(expr_context_ty ctx) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
87 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
88 switch (ctx) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
89 case Load: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
90 return "Load"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
91 case Store: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
92 return "Store"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
93 case Del: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
94 return "Del"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
95 case AugLoad: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
96 return "AugLoad"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
97 case AugStore: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
98 return "AugStore"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
99 case Param: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
100 return "Param"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
101 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
102 assert(0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
103 return "(unknown)"; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
104 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
105 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
106 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
107 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
108 validate_arguments(arguments_ty args) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
109 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
110 if (!validate_args(args->args)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
111 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
112 if (args->varargannotation) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
113 if (!args->vararg) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
114 PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
115 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
116 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
117 if (!validate_expr(args->varargannotation, Load)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
118 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
119 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
120 if (!validate_args(args->kwonlyargs)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
121 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
122 if (args->kwargannotation) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
123 if (!args->kwarg) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
124 PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
125 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
126 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
127 if (!validate_expr(args->kwargannotation, Load)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
128 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
129 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
130 if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
131 PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
132 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
133 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
134 if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
135 PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as " |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
136 "kw_defaults on arguments"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
137 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
138 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
139 return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
140 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
141 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
142 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
143 validate_expr(expr_ty exp, expr_context_ty ctx) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
144 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
145 int check_ctx = 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
146 expr_context_ty actual_ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
147 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
148 /* First check expression context. */ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
149 switch (exp->kind) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
150 case Attribute_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
151 actual_ctx = exp->v.Attribute.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
152 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
153 case Subscript_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
154 actual_ctx = exp->v.Subscript.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
155 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
156 case Starred_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
157 actual_ctx = exp->v.Starred.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
158 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
159 case Name_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
160 actual_ctx = exp->v.Name.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
161 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
162 case List_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
163 actual_ctx = exp->v.List.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
164 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
165 case Tuple_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
166 actual_ctx = exp->v.Tuple.ctx; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
167 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
168 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
169 if (ctx != Load) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
170 PyErr_Format(PyExc_ValueError, "expression which can't be " |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
171 "assigned to in %s context", expr_context_name(ctx)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
172 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
173 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
174 check_ctx = 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
175 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
176 if (check_ctx && actual_ctx != ctx) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
177 PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead", |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
178 expr_context_name(ctx), expr_context_name(actual_ctx)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
179 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
180 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
181 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
182 /* Now validate expression. */ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
183 switch (exp->kind) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
184 case BoolOp_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
185 if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
186 PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
187 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
188 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
189 return validate_exprs(exp->v.BoolOp.values, Load, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
190 case BinOp_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
191 return validate_expr(exp->v.BinOp.left, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
192 validate_expr(exp->v.BinOp.right, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
193 case UnaryOp_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
194 return validate_expr(exp->v.UnaryOp.operand, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
195 case Lambda_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
196 return validate_arguments(exp->v.Lambda.args) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
197 validate_expr(exp->v.Lambda.body, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
198 case IfExp_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
199 return validate_expr(exp->v.IfExp.test, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
200 validate_expr(exp->v.IfExp.body, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
201 validate_expr(exp->v.IfExp.orelse, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
202 case Dict_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
203 if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
204 PyErr_SetString(PyExc_ValueError, |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
205 "Dict doesn't have the same number of keys as values"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
206 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
207 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
208 return validate_exprs(exp->v.Dict.keys, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
209 validate_exprs(exp->v.Dict.values, Load, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
210 case Set_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
211 return validate_exprs(exp->v.Set.elts, Load, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
212 #define COMP(NAME) \ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
213 case NAME ## _kind: \ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
214 return validate_comprehension(exp->v.NAME.generators) && \ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
215 validate_expr(exp->v.NAME.elt, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
216 COMP(ListComp) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
217 COMP(SetComp) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
218 COMP(GeneratorExp) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
219 #undef COMP |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
220 case DictComp_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
221 return validate_comprehension(exp->v.DictComp.generators) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
222 validate_expr(exp->v.DictComp.key, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
223 validate_expr(exp->v.DictComp.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
224 case Yield_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
225 return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load); |
|
74391
e1177b9167ce
make YieldFrom its own distinct from Yield (closes #13780)
Benjamin Peterson <benjamin@python.org>
parents:
74356
diff
changeset
|
226 case YieldFrom_kind: |
|
80589
ffb2fa900cb7
Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents:
78963
diff
changeset
|
227 return validate_expr(exp->v.YieldFrom.value, Load); |
|
71795
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
228 case Compare_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
229 if (!asdl_seq_LEN(exp->v.Compare.comparators)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
230 PyErr_SetString(PyExc_ValueError, "Compare with no comparators"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
231 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
232 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
233 if (asdl_seq_LEN(exp->v.Compare.comparators) != |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
234 asdl_seq_LEN(exp->v.Compare.ops)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
235 PyErr_SetString(PyExc_ValueError, "Compare has a different number " |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
236 "of comparators and operands"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
237 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
238 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
239 return validate_exprs(exp->v.Compare.comparators, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
240 validate_expr(exp->v.Compare.left, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
241 case Call_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
242 return validate_expr(exp->v.Call.func, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
243 validate_exprs(exp->v.Call.args, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
244 validate_keywords(exp->v.Call.keywords) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
245 (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
246 (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
247 case Num_kind: { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
248 PyObject *n = exp->v.Num.n; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
249 if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
250 !PyComplex_CheckExact(n)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
251 PyErr_SetString(PyExc_TypeError, "non-numeric type in Num"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
252 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
253 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
254 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
255 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
256 case Str_kind: { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
257 PyObject *s = exp->v.Str.s; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
258 if (!PyUnicode_CheckExact(s)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
259 PyErr_SetString(PyExc_TypeError, "non-string type in Str"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
260 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
261 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
262 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
263 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
264 case Bytes_kind: { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
265 PyObject *b = exp->v.Bytes.s; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
266 if (!PyBytes_CheckExact(b)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
267 PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
268 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
269 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
270 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
271 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
272 case Attribute_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
273 return validate_expr(exp->v.Attribute.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
274 case Subscript_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
275 return validate_slice(exp->v.Subscript.slice) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
276 validate_expr(exp->v.Subscript.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
277 case Starred_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
278 return validate_expr(exp->v.Starred.value, ctx); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
279 case List_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
280 return validate_exprs(exp->v.List.elts, ctx, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
281 case Tuple_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
282 return validate_exprs(exp->v.Tuple.elts, ctx, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
283 /* These last cases don't have any checking. */ |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
284 case Name_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
285 case Ellipsis_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
286 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
287 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
288 PyErr_SetString(PyExc_SystemError, "unexpected expression"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
289 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
290 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
291 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
292 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
293 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
294 validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
295 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
296 if (asdl_seq_LEN(seq)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
297 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
298 PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
299 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
300 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
301 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
302 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
303 validate_assignlist(asdl_seq *targets, expr_context_ty ctx) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
304 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
305 return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
306 validate_exprs(targets, ctx, 0); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
307 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
308 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
309 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
310 validate_body(asdl_seq *body, const char *owner) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
311 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
312 return validate_nonempty_seq(body, "body", owner) && validate_stmts(body); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
313 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
314 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
315 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
316 validate_stmt(stmt_ty stmt) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
317 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
318 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
319 switch (stmt->kind) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
320 case FunctionDef_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
321 return validate_body(stmt->v.FunctionDef.body, "FunctionDef") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
322 validate_arguments(stmt->v.FunctionDef.args) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
323 validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
324 (!stmt->v.FunctionDef.returns || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
325 validate_expr(stmt->v.FunctionDef.returns, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
326 case ClassDef_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
327 return validate_body(stmt->v.ClassDef.body, "ClassDef") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
328 validate_exprs(stmt->v.ClassDef.bases, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
329 validate_keywords(stmt->v.ClassDef.keywords) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
330 validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
331 (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
332 (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
333 case Return_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
334 return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
335 case Delete_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
336 return validate_assignlist(stmt->v.Delete.targets, Del); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
337 case Assign_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
338 return validate_assignlist(stmt->v.Assign.targets, Store) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
339 validate_expr(stmt->v.Assign.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
340 case AugAssign_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
341 return validate_expr(stmt->v.AugAssign.target, Store) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
342 validate_expr(stmt->v.AugAssign.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
343 case For_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
344 return validate_expr(stmt->v.For.target, Store) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
345 validate_expr(stmt->v.For.iter, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
346 validate_body(stmt->v.For.body, "For") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
347 validate_stmts(stmt->v.For.orelse); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
348 case While_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
349 return validate_expr(stmt->v.While.test, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
350 validate_body(stmt->v.While.body, "While") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
351 validate_stmts(stmt->v.While.orelse); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
352 case If_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
353 return validate_expr(stmt->v.If.test, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
354 validate_body(stmt->v.If.body, "If") && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
355 validate_stmts(stmt->v.If.orelse); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
356 case With_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
357 if (!validate_nonempty_seq(stmt->v.With.items, "items", "With")) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
358 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
359 for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
360 withitem_ty item = asdl_seq_GET(stmt->v.With.items, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
361 if (!validate_expr(item->context_expr, Load) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
362 (item->optional_vars && !validate_expr(item->optional_vars, Store))) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
363 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
364 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
365 return validate_body(stmt->v.With.body, "With"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
366 case Raise_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
367 if (stmt->v.Raise.exc) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
368 return validate_expr(stmt->v.Raise.exc, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
369 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
370 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
371 if (stmt->v.Raise.cause) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
372 PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
373 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
374 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
375 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
376 case Try_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
377 if (!validate_body(stmt->v.Try.body, "Try")) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
378 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
379 if (!asdl_seq_LEN(stmt->v.Try.handlers) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
380 !asdl_seq_LEN(stmt->v.Try.finalbody)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
381 PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
382 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
383 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
384 if (!asdl_seq_LEN(stmt->v.Try.handlers) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
385 asdl_seq_LEN(stmt->v.Try.orelse)) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
386 PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
387 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
388 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
389 for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
390 excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
391 if ((handler->v.ExceptHandler.type && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
392 !validate_expr(handler->v.ExceptHandler.type, Load)) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
393 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler")) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
394 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
395 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
396 return (!asdl_seq_LEN(stmt->v.Try.finalbody) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
397 validate_stmts(stmt->v.Try.finalbody)) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
398 (!asdl_seq_LEN(stmt->v.Try.orelse) || |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
399 validate_stmts(stmt->v.Try.orelse)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
400 case Assert_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
401 return validate_expr(stmt->v.Assert.test, Load) && |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
402 (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load)); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
403 case Import_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
404 return validate_nonempty_seq(stmt->v.Import.names, "names", "Import"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
405 case ImportFrom_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
406 if (stmt->v.ImportFrom.level < -1) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
407 PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
408 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
409 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
410 return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
411 case Global_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
412 return validate_nonempty_seq(stmt->v.Global.names, "names", "Global"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
413 case Nonlocal_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
414 return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
415 case Expr_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
416 return validate_expr(stmt->v.Expr.value, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
417 case Pass_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
418 case Break_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
419 case Continue_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
420 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
421 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
422 PyErr_SetString(PyExc_SystemError, "unexpected statement"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
423 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
424 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
425 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
426 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
427 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
428 validate_stmts(asdl_seq *seq) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
429 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
430 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
431 for (i = 0; i < asdl_seq_LEN(seq); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
432 stmt_ty stmt = asdl_seq_GET(seq, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
433 if (stmt) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
434 if (!validate_stmt(stmt)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
435 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
436 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
437 else { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
438 PyErr_SetString(PyExc_ValueError, |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
439 "None disallowed in statement list"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
440 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
441 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
442 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
443 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
444 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
445 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
446 static int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
447 validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
448 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
449 int i; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
450 for (i = 0; i < asdl_seq_LEN(exprs); i++) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
451 expr_ty expr = asdl_seq_GET(exprs, i); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
452 if (expr) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
453 if (!validate_expr(expr, ctx)) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
454 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
455 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
456 else if (!null_ok) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
457 PyErr_SetString(PyExc_ValueError, |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
458 "None disallowed in expression list"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
459 return 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
460 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
461 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
462 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
463 return 1; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
464 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
465 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
466 int |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
467 PyAST_Validate(mod_ty mod) |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
468 { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
469 int res = 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
470 |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
471 switch (mod->kind) { |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
472 case Module_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
473 res = validate_stmts(mod->v.Module.body); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
474 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
475 case Interactive_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
476 res = validate_stmts(mod->v.Interactive.body); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
477 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
478 case Expression_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
479 res = validate_expr(mod->v.Expression.body, Load); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
480 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
481 case Suite_kind: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
482 PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
483 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
484 default: |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
485 PyErr_SetString(PyExc_SystemError, "impossible module node"); |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
486 res = 0; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
487 break; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
488 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
489 return res; |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
490 } |
|
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
491 |
| 74448 | 492 /* This is done here, so defines like "test" don't interfere with AST use above. */ |
|
71795
4090dfdf91a4
add a AST validator (closes #12575)
Benjamin Peterson <benjamin@python.org>
parents:
70918
diff
changeset
|
493 #include "grammar.h" |
| 35742 | 494 #include "parsetok.h" |
| 495 #include "graminit.h" | |
| 496 | |
| 497 /* Data structure used internally */ | |
| 498 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
|
499 char *c_encoding; /* source encoding */ |
|
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
|
500 PyArena *c_arena; /* arena for allocating memeory */ |
|
44025
ebc7389297d6
Merged revisions 59107-59186 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
43961
diff
changeset
|
501 const char *c_filename; /* filename */ |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
502 PyObject *c_normalize; /* Normalization function from unicodedata. */ |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
503 PyObject *c_normalize_args; /* Normalization argument tuple. */ |
| 35742 | 504 }; |
| 505 | |
| 506 static asdl_seq *seq_for_testlist(struct compiling *, const node *); | |
| 507 static expr_ty ast_for_expr(struct compiling *, const node *); | |
| 508 static stmt_ty ast_for_stmt(struct compiling *, const node *); | |
| 509 static asdl_seq *ast_for_suite(struct compiling *, const node *); | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
510 static asdl_seq *ast_for_exprlist(struct compiling *, const node *, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
511 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
|
512 static expr_ty ast_for_testlist(struct compiling *, const node *); |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
513 static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *); |
| 35742 | 514 |
| 515 /* Note different signature for ast_for_call */ | |
| 516 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty); | |
| 517 | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
518 static PyObject *parsenumber(struct compiling *, const char *); |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
519 static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode); |
| 40894 | 520 static PyObject *parsestrplus(struct compiling *, const node *n, |
| 521 int *bytesmode); | |
| 35742 | 522 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
523 #define COMP_GENEXP 0 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
524 #define COMP_LISTCOMP 1 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
525 #define COMP_SETCOMP 2 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
526 |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
527 static int |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
528 init_normalization(struct compiling *c) |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
529 { |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
530 PyObject *m = PyImport_ImportModuleNoBlock("unicodedata"); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
531 if (!m) |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
532 return 0; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
533 c->c_normalize = PyObject_GetAttrString(m, "normalize"); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
534 Py_DECREF(m); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
535 if (!c->c_normalize) |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
536 return 0; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
537 c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
538 PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
539 if (!c->c_normalize_args) { |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
540 Py_CLEAR(c->c_normalize); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
541 return 0; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
542 } |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
543 return 1; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
544 } |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
545 |
|
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
|
546 static identifier |
| 78842 | 547 new_identifier(const char *n, struct compiling *c) |
|
42597
20477cbfd996
Implement PEP 3131. Add isidentifier to str.
Martin v. Löwis <martin@v.loewis.de>
parents:
42549
diff
changeset
|
548 { |
|
78841
0c6a09b982d8
put * in the normal place
Benjamin Peterson <benjamin@python.org>
parents:
78838
diff
changeset
|
549 PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
550 if (!id) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
551 return NULL; |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
552 /* PyUnicode_DecodeUTF8 should always return a ready string. */ |
|
74443
f5214817ed57
PyUnicode_DecodeUTF8 will always return a ready string
Benjamin Peterson <benjamin@python.org>
parents:
74442
diff
changeset
|
553 assert(PyUnicode_IS_READY(id)); |
|
42597
20477cbfd996
Implement PEP 3131. Add isidentifier to str.
Martin v. Löwis <martin@v.loewis.de>
parents:
42549
diff
changeset
|
554 /* Check whether there are non-ASCII characters in the |
|
20477cbfd996
Implement PEP 3131. Add isidentifier to str.
Martin v. Löwis <martin@v.loewis.de>
parents:
42549
diff
changeset
|
555 identifier; if so, normalize to NFKC. */ |
|
74447
ca5c5142da58
invert condition (head bang)
Benjamin Peterson <benjamin@python.org>
parents:
74445
diff
changeset
|
556 if (!PyUnicode_IS_ASCII(id)) { |
| 72475 | 557 PyObject *id2; |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
558 if (!c->c_normalize && !init_normalization(c)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
559 Py_DECREF(id); |
| 72475 | 560 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
561 } |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
562 PyTuple_SET_ITEM(c->c_normalize_args, 1, id); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
563 id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL); |
|
74445
5ef589e38985
fix possible refleaks
Benjamin Peterson <benjamin@python.org>
parents:
74444
diff
changeset
|
564 Py_DECREF(id); |
| 72475 | 565 if (!id2) |
| 566 return NULL; | |
| 567 id = id2; | |
|
42597
20477cbfd996
Implement PEP 3131. Add isidentifier to str.
Martin v. Löwis <martin@v.loewis.de>
parents:
42549
diff
changeset
|
568 } |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
569 PyUnicode_InternInPlace(&id); |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
570 PyArena_AddPyObject(c->c_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
|
571 return id; |
| 35742 | 572 } |
| 573 | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
574 #define NEW_IDENTIFIER(n) new_identifier(STR(n), c) |
| 35742 | 575 |
| 576 static int | |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
577 ast_error(struct compiling *c, const node *n, const char *errmsg) |
| 35742 | 578 { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
579 PyObject *value, *errstr, *loc, *tmp; |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64185
diff
changeset
|
580 PyObject *filename_obj; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
581 |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
582 loc = PyErr_ProgramText(c->c_filename, LINENO(n)); |
| 35742 | 583 if (!loc) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
584 Py_INCREF(Py_None); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
585 loc = Py_None; |
| 35742 | 586 } |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
587 if (c->c_filename) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
588 filename_obj = PyUnicode_DecodeFSDefault(c->c_filename); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
589 if (!filename_obj) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
590 Py_DECREF(loc); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
591 return 0; |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
592 } |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
593 } else { |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64185
diff
changeset
|
594 Py_INCREF(Py_None); |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64185
diff
changeset
|
595 filename_obj = Py_None; |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
64185
diff
changeset
|
596 } |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
597 tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
598 if (!tmp) |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
599 return 0; |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
600 errstr = PyUnicode_FromString(errmsg); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
601 if (!errstr) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
602 Py_DECREF(tmp); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
603 return 0; |
|
36000
cc3261597136
SF #1370197, memory leak - ast_error_finish (in error conditions).
Neal Norwitz <nnorwitz@gmail.com>
parents:
35990
diff
changeset
|
604 } |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
605 value = PyTuple_Pack(2, errstr, tmp); |
| 35742 | 606 Py_DECREF(errstr); |
| 607 Py_DECREF(tmp); | |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
608 if (value) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
609 PyErr_SetObject(PyExc_SyntaxError, value); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
610 Py_DECREF(value); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
611 } |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
612 return 0; |
| 35742 | 613 } |
| 614 | |
| 615 /* num_stmts() returns number of contained statements. | |
| 616 | |
| 617 Use this routine to determine how big a sequence is needed for | |
| 618 the statements in a parse tree. Its raison d'etre is this bit of | |
| 619 grammar: | |
| 620 | |
| 621 stmt: simple_stmt | compound_stmt | |
| 622 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE | |
| 623 | |
| 624 A simple_stmt can contain multiple small_stmt elements joined | |
| 625 by semicolons. If the arg is a simple_stmt, the number of | |
| 626 small_stmt elements is returned. | |
| 627 */ | |
| 628 | |
| 629 static int | |
| 630 num_stmts(const node *n) | |
| 631 { | |
| 632 int i, l; | |
| 633 node *ch; | |
| 634 | |
| 635 switch (TYPE(n)) { | |
| 636 case single_input: | |
| 637 if (TYPE(CHILD(n, 0)) == NEWLINE) | |
| 638 return 0; | |
| 639 else | |
| 640 return num_stmts(CHILD(n, 0)); | |
| 641 case file_input: | |
| 642 l = 0; | |
| 643 for (i = 0; i < NCH(n); i++) { | |
| 644 ch = CHILD(n, i); | |
| 645 if (TYPE(ch) == stmt) | |
| 646 l += num_stmts(ch); | |
| 647 } | |
| 648 return l; | |
| 649 case stmt: | |
| 650 return num_stmts(CHILD(n, 0)); | |
| 651 case compound_stmt: | |
| 652 return 1; | |
| 653 case simple_stmt: | |
| 654 return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */ | |
| 655 case suite: | |
| 656 if (NCH(n) == 1) | |
| 657 return num_stmts(CHILD(n, 0)); | |
| 658 else { | |
| 659 l = 0; | |
| 660 for (i = 2; i < (NCH(n) - 1); i++) | |
| 661 l += num_stmts(CHILD(n, i)); | |
| 662 return l; | |
| 663 } | |
| 664 default: { | |
| 665 char buf[128]; | |
| 666 | |
|
50886
581d8602f3f7
Merged revisions 68746 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50035
diff
changeset
|
667 sprintf(buf, "Non-statement found: %d %d", |
| 35742 | 668 TYPE(n), NCH(n)); |
| 669 Py_FatalError(buf); | |
| 670 } | |
| 671 } | |
| 672 assert(0); | |
| 673 return 0; | |
| 674 } | |
| 675 | |
| 676 /* Transform the CST rooted at node * to the appropriate AST | |
| 677 */ | |
| 678 | |
| 679 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
|
680 PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename, |
|
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
|
681 PyArena *arena) |
| 35742 | 682 { |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
683 int i, j, k, num; |
| 35742 | 684 asdl_seq *stmts = NULL; |
| 685 stmt_ty s; | |
| 686 node *ch; | |
| 687 struct compiling c; | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
688 mod_ty res = NULL; |
| 35742 | 689 |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
690 c.c_arena = arena; |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
691 c.c_filename = filename; |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
692 c.c_normalize = c.c_normalize_args = NULL; |
| 35742 | 693 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) { |
|
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
|
694 c.c_encoding = "utf-8"; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
695 if (TYPE(n) == encoding_decl) { |
|
42054
063530fcc32e
Minimal changes to make the "freeze" tool work again.
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
696 #if 0 |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
697 ast_error(c, n, "encoding declaration in Unicode string"); |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
698 goto out; |
|
42054
063530fcc32e
Minimal changes to make the "freeze" tool work again.
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
699 #endif |
|
063530fcc32e
Minimal changes to make the "freeze" tool work again.
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
700 n = CHILD(n, 0); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
701 } |
| 35742 | 702 } else if (TYPE(n) == encoding_decl) { |
| 703 c.c_encoding = STR(n); | |
| 704 n = CHILD(n, 0); | |
| 705 } else { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
706 /* PEP 3120 */ |
| 42403 | 707 c.c_encoding = "utf-8"; |
| 35742 | 708 } |
| 709 | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
710 k = 0; |
| 35742 | 711 switch (TYPE(n)) { |
| 712 case file_input: | |
|
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
|
713 stmts = asdl_seq_new(num_stmts(n), arena); |
| 35742 | 714 if (!stmts) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
715 goto out; |
| 35742 | 716 for (i = 0; i < NCH(n) - 1; i++) { |
| 717 ch = CHILD(n, i); | |
| 718 if (TYPE(ch) == NEWLINE) | |
| 719 continue; | |
| 720 REQ(ch, stmt); | |
| 721 num = num_stmts(ch); | |
| 722 if (num == 1) { | |
| 723 s = ast_for_stmt(&c, ch); | |
| 724 if (!s) | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
725 goto out; |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
726 asdl_seq_SET(stmts, k++, s); |
| 35742 | 727 } |
| 728 else { | |
| 729 ch = CHILD(ch, 0); | |
| 730 REQ(ch, simple_stmt); | |
| 731 for (j = 0; j < num; j++) { | |
| 732 s = ast_for_stmt(&c, CHILD(ch, j * 2)); | |
| 733 if (!s) | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
734 goto out; |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
735 asdl_seq_SET(stmts, k++, s); |
| 35742 | 736 } |
| 737 } | |
| 738 } | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
739 res = Module(stmts, arena); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
740 break; |
| 35742 | 741 case eval_input: { |
| 742 expr_ty testlist_ast; | |
| 743 | |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
744 /* XXX Why not comp_for here? */ |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
745 testlist_ast = ast_for_testlist(&c, CHILD(n, 0)); |
| 35742 | 746 if (!testlist_ast) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
747 goto out; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
748 res = Expression(testlist_ast, arena); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
749 break; |
| 35742 | 750 } |
| 751 case single_input: | |
| 752 if (TYPE(CHILD(n, 0)) == NEWLINE) { | |
|
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
|
753 stmts = asdl_seq_new(1, arena); |
| 35742 | 754 if (!stmts) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
755 goto out; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
756 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
757 arena)); |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
758 if (!asdl_seq_GET(stmts, 0)) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
759 goto out; |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
760 res = Interactive(stmts, arena); |
| 35742 | 761 } |
| 762 else { | |
| 763 n = CHILD(n, 0); | |
| 764 num = 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
|
765 stmts = asdl_seq_new(num, arena); |
| 35742 | 766 if (!stmts) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
767 goto out; |
| 35742 | 768 if (num == 1) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
769 s = ast_for_stmt(&c, n); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
770 if (!s) |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
771 goto out; |
| 35742 | 772 asdl_seq_SET(stmts, 0, s); |
| 773 } | |
| 774 else { | |
| 775 /* Only a simple_stmt can contain multiple statements. */ | |
| 776 REQ(n, simple_stmt); | |
| 777 for (i = 0; i < NCH(n); i += 2) { | |
| 778 if (TYPE(CHILD(n, i)) == NEWLINE) | |
| 779 break; | |
| 780 s = ast_for_stmt(&c, CHILD(n, i)); | |
| 781 if (!s) | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
782 goto out; |
| 35742 | 783 asdl_seq_SET(stmts, i / 2, s); |
| 784 } | |
| 785 } | |
| 786 | |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
787 res = Interactive(stmts, arena); |
| 35742 | 788 } |
|
74460
953d6ee29464
break out switch at correct place
Benjamin Peterson <benjamin@python.org>
parents:
74459
diff
changeset
|
789 break; |
| 35742 | 790 default: |
|
41716
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
791 PyErr_Format(PyExc_SystemError, |
|
00c02c4488ce
Merged revisions 55325-55327 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
792 "invalid node %d for PyAST_FromNode", TYPE(n)); |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
793 goto out; |
| 35742 | 794 } |
|
74457
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
795 out: |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
796 if (c.c_normalize) { |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
797 Py_DECREF(c.c_normalize); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
798 PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
799 Py_DECREF(c.c_normalize_args); |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
800 } |
|
0677f05d6ece
streamline normalizer identification a bit
Benjamin Peterson <benjamin@python.org>
parents:
74448
diff
changeset
|
801 return res; |
| 35742 | 802 } |
| 803 | |
| 804 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) | |
| 805 */ | |
| 806 | |
| 807 static operator_ty | |
| 808 get_operator(const node *n) | |
| 809 { | |
| 810 switch (TYPE(n)) { | |
| 811 case VBAR: | |
| 812 return BitOr; | |
| 813 case CIRCUMFLEX: | |
| 814 return BitXor; | |
| 815 case AMPER: | |
| 816 return BitAnd; | |
| 817 case LEFTSHIFT: | |
| 818 return LShift; | |
| 819 case RIGHTSHIFT: | |
| 820 return RShift; | |
| 821 case PLUS: | |
| 822 return Add; | |
| 823 case MINUS: | |
| 824 return Sub; | |
| 825 case STAR: | |
| 826 return Mult; | |
| 827 case SLASH: | |
| 828 return Div; | |
| 829 case DOUBLESLASH: | |
| 830 return FloorDiv; | |
| 831 case PERCENT: | |
| 832 return Mod; | |
| 833 default: | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
834 return (operator_ty)0; |
| 35742 | 835 } |
| 836 } | |
| 837 | |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
838 static const char* FORBIDDEN[] = { |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
839 "None", |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
840 "True", |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
841 "False", |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
842 NULL, |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
843 }; |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
844 |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
845 static int |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
846 forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks) |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
847 { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
848 assert(PyUnicode_Check(name)); |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
849 if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
850 ast_error(c, n, "assignment to keyword"); |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
851 return 1; |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
852 } |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
853 if (full_checks) { |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
854 const char **p; |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
855 for (p = FORBIDDEN; *p; p++) { |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
856 if (PyUnicode_CompareWithASCIIString(name, *p) == 0) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
857 ast_error(c, n, "assignment to keyword"); |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
858 return 1; |
|
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
859 } |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
860 } |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
861 } |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
862 return 0; |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
863 } |
|
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
864 |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
865 /* Set the context ctx for expr_ty e, recursively traversing e. |
| 35742 | 866 |
| 867 Only sets context for expr kinds that "can appear in assignment context" | |
| 868 (according to ../Parser/Python.asdl). For other expr kinds, it sets | |
| 869 an appropriate syntax error and returns false. | |
| 870 */ | |
| 871 | |
| 872 static int | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
873 set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) |
| 35742 | 874 { |
| 875 asdl_seq *s = NULL; | |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
876 /* 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
|
877 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
|
878 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
879 const char* expr_name = NULL; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
880 |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
881 /* 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
|
882 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
|
883 a little more complex than necessary as a result. It also means |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
884 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
|
885 Consider restructuring so that augmented assignment uses |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
886 set_context(), too. |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
887 */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
888 assert(ctx != AugStore && ctx != AugLoad); |
| 35742 | 889 |
| 890 switch (e->kind) { | |
| 891 case Attribute_kind: | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
892 e->v.Attribute.ctx = ctx; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
893 if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
894 return 0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
895 break; |
| 35742 | 896 case Subscript_kind: |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
897 e->v.Subscript.ctx = ctx; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
898 break; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
899 case Starred_kind: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
900 e->v.Starred.ctx = ctx; |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
901 if (!set_context(c, e->v.Starred.value, ctx, n)) |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
902 return 0; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
903 break; |
| 35742 | 904 case Name_kind: |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
905 if (ctx == Store) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
906 if (forbidden_name(c, e->v.Name.id, n, 1)) |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
907 return 0; /* forbidden_name() calls ast_error() */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
908 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
909 e->v.Name.ctx = ctx; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
910 break; |
| 35742 | 911 case List_kind: |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
912 e->v.List.ctx = ctx; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
913 s = e->v.List.elts; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
914 break; |
| 35742 | 915 case Tuple_kind: |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
916 if (asdl_seq_LEN(e->v.Tuple.elts)) { |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
917 e->v.Tuple.ctx = ctx; |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
918 s = e->v.Tuple.elts; |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
919 } |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
920 else { |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
921 expr_name = "()"; |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
922 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
923 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
924 case Lambda_kind: |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
925 expr_name = "lambda"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
926 break; |
| 35742 | 927 case Call_kind: |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
928 expr_name = "function call"; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
929 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
930 case BoolOp_kind: |
| 35742 | 931 case BinOp_kind: |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
932 case UnaryOp_kind: |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
933 expr_name = "operator"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
934 break; |
| 35742 | 935 case GeneratorExp_kind: |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
936 expr_name = "generator expression"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
937 break; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
938 case Yield_kind: |
|
74391
e1177b9167ce
make YieldFrom its own distinct from Yield (closes #13780)
Benjamin Peterson <benjamin@python.org>
parents:
74356
diff
changeset
|
939 case YieldFrom_kind: |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
940 expr_name = "yield expression"; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
941 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
942 case ListComp_kind: |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
943 expr_name = "list comprehension"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
944 break; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
945 case SetComp_kind: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
946 expr_name = "set comprehension"; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
947 break; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
948 case DictComp_kind: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
949 expr_name = "dict comprehension"; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
950 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
951 case Dict_kind: |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
952 case Set_kind: |
| 35742 | 953 case Num_kind: |
| 954 case Str_kind: | |
|
69288
4d9a8e84279a
make assigning to a bytes literal a syntax error (closes #11506)
Benjamin Peterson <benjamin@python.org>
parents:
65536
diff
changeset
|
955 case Bytes_kind: |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
956 expr_name = "literal"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
957 break; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
958 case Ellipsis_kind: |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
959 expr_name = "Ellipsis"; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
960 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
961 case Compare_kind: |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
962 expr_name = "comparison"; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
963 break; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
964 case IfExp_kind: |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
965 expr_name = "conditional expression"; |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
966 break; |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
967 default: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
968 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
969 "unexpected expression in assignment %d (line %d)", |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
970 e->kind, e->lineno); |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
971 return 0; |
| 35742 | 972 } |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
973 /* Check for error string set by switch */ |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
974 if (expr_name) { |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
975 char buf[300]; |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
976 PyOS_snprintf(buf, sizeof(buf), |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
977 "can't %s %s", |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
978 ctx == Store ? "assign to" : "delete", |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
979 expr_name); |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
980 return ast_error(c, n, buf); |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
981 } |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
982 |
| 35742 | 983 /* If the LHS is a list or tuple, we need to set the assignment |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
984 context for all the contained elements. |
| 35742 | 985 */ |
| 986 if (s) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
987 int i; |
| 35742 | 988 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
989 for (i = 0; i < asdl_seq_LEN(s); i++) { |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
990 if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n)) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
991 return 0; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
992 } |
| 35742 | 993 } |
| 994 return 1; | |
| 995 } | |
| 996 | |
| 997 static operator_ty | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
998 ast_for_augassign(struct compiling *c, const node *n) |
| 35742 | 999 { |
| 1000 REQ(n, augassign); | |
| 1001 n = CHILD(n, 0); | |
| 1002 switch (STR(n)[0]) { | |
| 1003 case '+': | |
| 1004 return Add; | |
| 1005 case '-': | |
| 1006 return Sub; | |
| 1007 case '/': | |
| 1008 if (STR(n)[1] == '/') | |
| 1009 return FloorDiv; | |
| 1010 else | |
| 1011 return Div; | |
| 1012 case '%': | |
| 1013 return Mod; | |
| 1014 case '<': | |
| 1015 return LShift; | |
| 1016 case '>': | |
| 1017 return RShift; | |
| 1018 case '&': | |
| 1019 return BitAnd; | |
| 1020 case '^': | |
| 1021 return BitXor; | |
| 1022 case '|': | |
| 1023 return BitOr; | |
| 1024 case '*': | |
| 1025 if (STR(n)[1] == '*') | |
| 1026 return Pow; | |
| 1027 else | |
| 1028 return Mult; | |
| 1029 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
1030 PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1031 return (operator_ty)0; |
| 35742 | 1032 } |
| 1033 } | |
| 1034 | |
| 1035 static cmpop_ty | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1036 ast_for_comp_op(struct compiling *c, const node *n) |
| 35742 | 1037 { |
|
39648
efe3f2c0da5e
Killed the <> operator. You must now use !=.
Guido van Rossum <guido@python.org>
parents:
39610
diff
changeset
|
1038 /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is' |
| 35742 | 1039 |'is' 'not' |
| 1040 */ | |
| 1041 REQ(n, comp_op); | |
| 1042 if (NCH(n) == 1) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1043 n = CHILD(n, 0); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1044 switch (TYPE(n)) { |
| 35742 | 1045 case LESS: |
| 1046 return Lt; | |
| 1047 case GREATER: | |
| 1048 return Gt; | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1049 case EQEQUAL: /* == */ |
| 35742 | 1050 return Eq; |
| 1051 case LESSEQUAL: | |
| 1052 return LtE; | |
| 1053 case GREATEREQUAL: | |
| 1054 return GtE; | |
| 1055 case NOTEQUAL: | |
| 1056 return NotEq; | |
| 1057 case NAME: | |
| 1058 if (strcmp(STR(n), "in") == 0) | |
| 1059 return In; | |
| 1060 if (strcmp(STR(n), "is") == 0) | |
| 1061 return Is; | |
| 1062 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
1063 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s", |
| 35742 | 1064 STR(n)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1065 return (cmpop_ty)0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1066 } |
| 35742 | 1067 } |
| 1068 else if (NCH(n) == 2) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1069 /* handle "not in" and "is not" */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1070 switch (TYPE(CHILD(n, 0))) { |
| 35742 | 1071 case NAME: |
| 1072 if (strcmp(STR(CHILD(n, 1)), "in") == 0) | |
| 1073 return NotIn; | |
| 1074 if (strcmp(STR(CHILD(n, 0)), "is") == 0) | |
| 1075 return IsNot; | |
| 1076 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
1077 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s", |
| 35742 | 1078 STR(CHILD(n, 0)), STR(CHILD(n, 1))); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1079 return (cmpop_ty)0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1080 } |
| 35742 | 1081 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
1082 PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children", |
| 35742 | 1083 NCH(n)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1084 return (cmpop_ty)0; |
| 35742 | 1085 } |
| 1086 | |
| 1087 static asdl_seq * | |
| 1088 seq_for_testlist(struct compiling *c, const node *n) | |
| 1089 { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56951
diff
changeset
|
1090 /* testlist: test (',' test)* [','] |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
1091 testlist_star_expr: test|star_expr (',' test|star_expr)* [','] |
|
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
1092 */ |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
1093 asdl_seq *seq; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
1094 expr_ty expression; |
|
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35748
diff
changeset
|
1095 int i; |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
1096 assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp); |
| 35742 | 1097 |
|
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
|
1098 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 1099 if (!seq) |
| 1100 return NULL; | |
| 1101 | |
| 1102 for (i = 0; i < NCH(n); i += 2) { | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56951
diff
changeset
|
1103 const node *ch = CHILD(n, i); |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
1104 assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr); |
| 35742 | 1105 |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
1106 expression = ast_for_expr(c, ch); |
|
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
|
1107 if (!expression) |
| 35742 | 1108 return NULL; |
| 1109 | |
| 1110 assert(i / 2 < seq->size); | |
| 1111 asdl_seq_SET(seq, i / 2, expression); | |
| 1112 } | |
| 1113 return seq; | |
| 1114 } | |
| 1115 | |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1116 static arg_ty |
|
75543
fe0b2681a42f
use correct naming convention
Benjamin Peterson <benjamin@python.org>
parents:
70916
diff
changeset
|
1117 ast_for_arg(struct compiling *c, const node *n) |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1118 { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1119 identifier name; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1120 expr_ty annotation = NULL; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1121 node *ch; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1122 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1123 assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1124 ch = CHILD(n, 0); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1125 name = NEW_IDENTIFIER(ch); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1126 if (!name) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1127 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1128 if (forbidden_name(c, name, ch, 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
1129 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1130 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1131 if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1132 annotation = ast_for_expr(c, CHILD(n, 2)); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1133 if (!annotation) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1134 return NULL; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1135 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1136 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1137 return arg(name, annotation, c->c_arena); |
| 35742 | 1138 } |
| 1139 | |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1140 /* returns -1 if failed to handle keyword only arguments |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1141 returns new position to keep processing if successful |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1142 (',' tfpdef ['=' test])* |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1143 ^^^ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1144 start pointing here |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1145 */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1146 static int |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1147 handle_keywordonly_args(struct compiling *c, const node *n, int start, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1148 asdl_seq *kwonlyargs, asdl_seq *kwdefaults) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1149 { |
|
49852
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1150 PyObject *argname; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1151 node *ch; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1152 expr_ty expression, annotation; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1153 arg_ty arg; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1154 int i = start; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1155 int j = 0; /* index for kwdefaults and kwonlyargs */ |
|
44246
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1156 |
|
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1157 if (kwonlyargs == NULL) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1158 ast_error(c, CHILD(n, start), "named arguments must follow bare *"); |
|
44246
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1159 return -1; |
|
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1160 } |
|
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1161 assert(kwdefaults != NULL); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1162 while (i < NCH(n)) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1163 ch = CHILD(n, i); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1164 switch (TYPE(ch)) { |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1165 case vfpdef: |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1166 case tfpdef: |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1167 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) { |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1168 expression = ast_for_expr(c, CHILD(n, i + 2)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1169 if (!expression) |
|
64185
38ceeae0d1f0
Merged revisions 84214 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64183
diff
changeset
|
1170 goto error; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1171 asdl_seq_SET(kwdefaults, j, expression); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1172 i += 2; /* '=' and test */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1173 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1174 else { /* setting NULL if no default value exists */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1175 asdl_seq_SET(kwdefaults, j, NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1176 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1177 if (NCH(ch) == 3) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1178 /* ch is NAME ':' test */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1179 annotation = ast_for_expr(c, CHILD(ch, 2)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1180 if (!annotation) |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1181 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1182 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1183 else { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1184 annotation = NULL; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1185 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1186 ch = CHILD(ch, 0); |
|
49852
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1187 argname = NEW_IDENTIFIER(ch); |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1188 if (!argname) |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1189 goto error; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1190 if (forbidden_name(c, argname, ch, 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
1191 goto error; |
|
49852
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1192 arg = arg(argname, annotation, c->c_arena); |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1193 if (!arg) |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
1194 goto error; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1195 asdl_seq_SET(kwonlyargs, j++, arg); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1196 i += 2; /* the name and the comma */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1197 break; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1198 case DOUBLESTAR: |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1199 return i; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1200 default: |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1201 ast_error(c, ch, "unexpected node"); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1202 goto error; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1203 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1204 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1205 return i; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1206 error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1207 return -1; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1208 } |
| 35742 | 1209 |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1210 /* Create AST for argument list. */ |
| 35742 | 1211 |
| 1212 static arguments_ty | |
| 1213 ast_for_arguments(struct compiling *c, const node *n) | |
| 1214 { | |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1215 /* This function handles both typedargslist (function definition) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1216 and varargslist (lambda definition). |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1217 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1218 parameters: '(' [typedargslist] ')' |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1219 typedargslist: ((tfpdef ['=' test] ',')* |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1220 ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1221 | '**' tfpdef) |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1222 | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1223 tfpdef: NAME [':' test] |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1224 varargslist: ((vfpdef ['=' test] ',')* |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1225 ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1226 | '**' vfpdef) |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1227 | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1228 vfpdef: NAME |
| 35742 | 1229 */ |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1230 int i, j, k, nposargs = 0, nkwonlyargs = 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1231 int nposdefaults = 0, found_default = 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1232 asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults; |
| 35742 | 1233 identifier vararg = NULL, kwarg = NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1234 arg_ty arg; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1235 expr_ty varargannotation = NULL, kwargannotation = NULL; |
| 35742 | 1236 node *ch; |
| 1237 | |
| 1238 if (TYPE(n) == parameters) { | |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1239 if (NCH(n) == 2) /* () as argument list */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1240 return arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1241 NULL, c->c_arena); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1242 n = CHILD(n, 1); |
| 35742 | 1243 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1244 assert(TYPE(n) == typedargslist || TYPE(n) == varargslist); |
| 35742 | 1245 |
|
48515
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1246 /* First count the number of positional args & defaults. The |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1247 variable i is the loop index for this for loop and the next. |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1248 The next loop picks up where the first leaves off. |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1249 */ |
| 35742 | 1250 for (i = 0; i < NCH(n); i++) { |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1251 ch = CHILD(n, i); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1252 if (TYPE(ch) == STAR) { |
|
48515
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1253 /* skip star */ |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1254 i++; |
|
48515
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1255 if (i < NCH(n) && /* skip argument following star */ |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1256 (TYPE(CHILD(n, i)) == tfpdef || |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1257 TYPE(CHILD(n, i)) == vfpdef)) { |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1258 i++; |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1259 } |
|
dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
48397
diff
changeset
|
1260 break; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1261 } |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1262 if (TYPE(ch) == DOUBLESTAR) break; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1263 if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1264 if (TYPE(ch) == EQUAL) nposdefaults++; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1265 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1266 /* count the number of keyword only args & |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1267 defaults for keyword only args */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1268 for ( ; i < NCH(n); ++i) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1269 ch = CHILD(n, i); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1270 if (TYPE(ch) == DOUBLESTAR) break; |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1271 if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++; |
| 35742 | 1272 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1273 posargs = (nposargs ? asdl_seq_new(nposargs, c->c_arena) : NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1274 if (!posargs && nposargs) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1275 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1276 kwonlyargs = (nkwonlyargs ? |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1277 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1278 if (!kwonlyargs && nkwonlyargs) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1279 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1280 posdefaults = (nposdefaults ? |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1281 asdl_seq_new(nposdefaults, c->c_arena) : NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1282 if (!posdefaults && nposdefaults) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1283 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1284 /* The length of kwonlyargs and kwdefaults are same |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1285 since we set NULL as default for keyword only argument w/o default |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1286 - we have sequence data structure, but no dictionary */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1287 kwdefaults = (nkwonlyargs ? |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1288 asdl_seq_new(nkwonlyargs, c->c_arena) : NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1289 if (!kwdefaults && nkwonlyargs) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1290 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1291 |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1292 if (nposargs + nkwonlyargs > 255) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1293 ast_error(c, n, "more than 255 arguments"); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1294 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1295 } |
| 35742 | 1296 |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1297 /* tfpdef: NAME [':' test] |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1298 vfpdef: NAME |
| 35742 | 1299 */ |
| 1300 i = 0; | |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1301 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
|
1302 k = 0; /* index for args */ |
| 35742 | 1303 while (i < NCH(n)) { |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1304 ch = CHILD(n, i); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1305 switch (TYPE(ch)) { |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1306 case tfpdef: |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1307 case vfpdef: |
| 35742 | 1308 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is |
| 1309 anything other than EQUAL or a comma? */ | |
| 1310 /* XXX Should NCH(n) check be made a separate check? */ | |
| 1311 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) { | |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1312 expr_ty expression = ast_for_expr(c, CHILD(n, i + 2)); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1313 if (!expression) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1314 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1315 assert(posdefaults != NULL); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1316 asdl_seq_SET(posdefaults, j++, expression); |
| 35742 | 1317 i += 2; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1318 found_default = 1; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1319 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1320 else if (found_default) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1321 ast_error(c, n, |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1322 "non-default argument follows default argument"); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1323 return NULL; |
| 35742 | 1324 } |
|
75543
fe0b2681a42f
use correct naming convention
Benjamin Peterson <benjamin@python.org>
parents:
70916
diff
changeset
|
1325 arg = ast_for_arg(c, ch); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1326 if (!arg) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1327 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1328 asdl_seq_SET(posargs, k++, arg); |
| 35742 | 1329 i += 2; /* the name and the comma */ |
| 1330 break; | |
| 1331 case STAR: | |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1332 if (i+1 >= NCH(n)) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1333 ast_error(c, CHILD(n, i), |
|
44246
aac33ee1a8fc
Issue #1573, second attempt:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44237
diff
changeset
|
1334 "named arguments must follow bare *"); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1335 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1336 } |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1337 ch = CHILD(n, i+1); /* tfpdef or COMMA */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1338 if (TYPE(ch) == COMMA) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1339 int res = 0; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1340 i += 2; /* now follows keyword only arguments */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1341 res = handle_keywordonly_args(c, n, i, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1342 kwonlyargs, kwdefaults); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1343 if (res == -1) return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1344 i = res; /* res has new position to process */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1345 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1346 else { |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1347 vararg = NEW_IDENTIFIER(CHILD(ch, 0)); |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1348 if (!vararg) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1349 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1350 if (forbidden_name(c, vararg, CHILD(ch, 0), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
1351 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1352 if (NCH(ch) > 1) { |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1353 /* there is an annotation on the vararg */ |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1354 varargannotation = ast_for_expr(c, CHILD(ch, 2)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1355 if (!varargannotation) |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1356 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1357 } |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1358 i += 3; |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1359 if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1360 || TYPE(CHILD(n, i)) == vfpdef)) { |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1361 int res = 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1362 res = handle_keywordonly_args(c, n, i, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1363 kwonlyargs, kwdefaults); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1364 if (res == -1) return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1365 i = res; /* res has new position to process */ |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1366 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1367 } |
| 35742 | 1368 break; |
| 1369 case DOUBLESTAR: | |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1370 ch = CHILD(n, i+1); /* tfpdef */ |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41716
diff
changeset
|
1371 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1372 kwarg = NEW_IDENTIFIER(CHILD(ch, 0)); |
|
64185
38ceeae0d1f0
Merged revisions 84214 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64183
diff
changeset
|
1373 if (!kwarg) |
|
38ceeae0d1f0
Merged revisions 84214 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
64183
diff
changeset
|
1374 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1375 if (NCH(ch) > 1) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1376 /* there is an annotation on the kwarg */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1377 kwargannotation = ast_for_expr(c, CHILD(ch, 2)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1378 if (!kwargannotation) |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1379 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1380 } |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1381 if (forbidden_name(c, kwarg, CHILD(ch, 0), 0)) |
|
64178
5fd26f452600
Check the return values for all functions returning an ast node.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62373
diff
changeset
|
1382 return NULL; |
| 35742 | 1383 i += 3; |
| 1384 break; | |
| 1385 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
1386 PyErr_Format(PyExc_SystemError, |
| 35742 | 1387 "unexpected node in varargslist: %d @ %d", |
| 1388 TYPE(ch), i); | |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1389 return NULL; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1390 } |
| 35742 | 1391 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1392 return arguments(posargs, vararg, varargannotation, kwonlyargs, kwarg, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1393 kwargannotation, posdefaults, kwdefaults, c->c_arena); |
| 35742 | 1394 } |
| 1395 | |
| 1396 static expr_ty | |
| 1397 ast_for_dotted_name(struct compiling *c, const node *n) | |
| 1398 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1399 expr_ty e; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1400 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
|
1401 int lineno, col_offset; |
| 35742 | 1402 int i; |
| 1403 | |
| 1404 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
|
1405 |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1406 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
|
1407 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
|
1408 |
| 35742 | 1409 id = NEW_IDENTIFIER(CHILD(n, 0)); |
| 1410 if (!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
|
1411 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
|
1412 e = Name(id, Load, lineno, col_offset, c->c_arena); |
| 35742 | 1413 if (!e) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1414 return NULL; |
| 35742 | 1415 |
| 1416 for (i = 2; i < NCH(n); i+=2) { | |
| 1417 id = NEW_IDENTIFIER(CHILD(n, i)); | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1418 if (!id) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1419 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1420 e = Attribute(e, id, Load, lineno, col_offset, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1421 if (!e) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1422 return NULL; |
| 35742 | 1423 } |
| 1424 | |
| 1425 return e; | |
| 1426 } | |
| 1427 | |
| 1428 static expr_ty | |
| 1429 ast_for_decorator(struct compiling *c, const node *n) | |
| 1430 { | |
| 1431 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ | |
| 1432 expr_ty d = NULL; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1433 expr_ty name_expr; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1434 |
| 35742 | 1435 REQ(n, decorator); |
|
36418
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
1436 REQ(CHILD(n, 0), AT); |
|
a625e8876407
Improved handling of syntax errors.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36242
diff
changeset
|
1437 REQ(RCHILD(n, -1), NEWLINE); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1438 |
| 35742 | 1439 name_expr = ast_for_dotted_name(c, CHILD(n, 1)); |
| 1440 if (!name_expr) | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1441 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1442 |
| 35742 | 1443 if (NCH(n) == 3) { /* No arguments */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1444 d = name_expr; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1445 name_expr = NULL; |
| 35742 | 1446 } |
| 1447 else if (NCH(n) == 5) { /* Call with no arguments */ | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1448 d = Call(name_expr, NULL, NULL, NULL, NULL, LINENO(n), |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1449 n->n_col_offset, c->c_arena); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1450 if (!d) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1451 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1452 name_expr = NULL; |
| 35742 | 1453 } |
| 1454 else { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1455 d = ast_for_call(c, CHILD(n, 3), name_expr); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1456 if (!d) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1457 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1458 name_expr = NULL; |
| 35742 | 1459 } |
| 1460 | |
| 1461 return d; | |
| 1462 } | |
| 1463 | |
| 1464 static asdl_seq* | |
| 1465 ast_for_decorators(struct compiling *c, const node *n) | |
| 1466 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1467 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
|
1468 expr_ty d; |
| 35742 | 1469 int i; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1470 |
| 35742 | 1471 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
|
1472 decorator_seq = asdl_seq_new(NCH(n), c->c_arena); |
| 35742 | 1473 if (!decorator_seq) |
| 1474 return NULL; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1475 |
| 35742 | 1476 for (i = 0; i < NCH(n); i++) { |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1477 d = ast_for_decorator(c, CHILD(n, i)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1478 if (!d) |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1479 return NULL; |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1480 asdl_seq_SET(decorator_seq, i, d); |
| 35742 | 1481 } |
| 1482 return decorator_seq; | |
| 1483 } | |
| 1484 | |
| 1485 static stmt_ty | |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1486 ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 1487 { |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1488 /* funcdef: 'def' NAME parameters ['->' test] ':' suite */ |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1489 identifier name; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1490 arguments_ty args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1491 asdl_seq *body; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1492 expr_ty returns = NULL; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1493 int name_i = 1; |
| 35742 | 1494 |
| 1495 REQ(n, funcdef); | |
| 1496 | |
| 1497 name = NEW_IDENTIFIER(CHILD(n, name_i)); | |
| 1498 if (!name) | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1499 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1500 if (forbidden_name(c, name, CHILD(n, name_i), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
1501 return NULL; |
| 35742 | 1502 args = ast_for_arguments(c, CHILD(n, name_i + 1)); |
| 1503 if (!args) | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1504 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1505 if (TYPE(CHILD(n, name_i+2)) == RARROW) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1506 returns = ast_for_expr(c, CHILD(n, name_i + 3)); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1507 if (!returns) |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
1508 return NULL; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1509 name_i += 2; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1510 } |
| 35742 | 1511 body = ast_for_suite(c, CHILD(n, name_i + 3)); |
| 1512 if (!body) | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1513 return NULL; |
| 35742 | 1514 |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1515 return FunctionDef(name, args, body, decorator_seq, returns, LINENO(n), |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1516 n->n_col_offset, c->c_arena); |
| 35742 | 1517 } |
| 1518 | |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1519 static stmt_ty |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1520 ast_for_decorated(struct compiling *c, const node *n) |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1521 { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1522 /* decorated: decorators (classdef | funcdef) */ |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1523 stmt_ty thing = NULL; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1524 asdl_seq *decorator_seq = NULL; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1525 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1526 REQ(n, decorated); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1527 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1528 decorator_seq = ast_for_decorators(c, CHILD(n, 0)); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1529 if (!decorator_seq) |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1530 return NULL; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1531 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1532 assert(TYPE(CHILD(n, 1)) == funcdef || |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1533 TYPE(CHILD(n, 1)) == classdef); |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1534 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1535 if (TYPE(CHILD(n, 1)) == funcdef) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1536 thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1537 } else if (TYPE(CHILD(n, 1)) == classdef) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1538 thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1539 } |
|
45448
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1540 /* we count the decorators in when talking about the class' or |
|
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1541 * function's line number */ |
|
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1542 if (thing) { |
|
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1543 thing->lineno = LINENO(n); |
|
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1544 thing->col_offset = n->n_col_offset; |
|
f1b50aa5d5af
Patch from Georg Brandl: Fix co_lineno of decorated function and class objects. If you see an error in test_inspect please delete all pyc files.
Christian Heimes <christian@cheimes.de>
parents:
44442
diff
changeset
|
1545 } |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1546 return thing; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1547 } |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1548 |
| 35742 | 1549 static expr_ty |
| 1550 ast_for_lambdef(struct compiling *c, const node *n) | |
| 1551 { | |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1552 /* lambdef: 'lambda' [varargslist] ':' test |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1553 lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */ |
| 35742 | 1554 arguments_ty args; |
| 1555 expr_ty expression; | |
| 1556 | |
| 1557 if (NCH(n) == 3) { | |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1558 args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1559 NULL, c->c_arena); |
| 35742 | 1560 if (!args) |
| 1561 return NULL; | |
| 1562 expression = ast_for_expr(c, CHILD(n, 2)); | |
|
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
|
1563 if (!expression) |
| 35742 | 1564 return NULL; |
| 1565 } | |
| 1566 else { | |
| 1567 args = ast_for_arguments(c, CHILD(n, 1)); | |
| 1568 if (!args) | |
| 1569 return NULL; | |
| 1570 expression = ast_for_expr(c, CHILD(n, 3)); | |
|
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
|
1571 if (!expression) |
| 35742 | 1572 return NULL; |
| 1573 } | |
| 1574 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
1575 return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1576 } |
| 1577 | |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1578 static expr_ty |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1579 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
|
1580 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1581 /* test: or_test 'if' or_test 'else' test */ |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1582 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
|
1583 |
|
36676
67c74efad8c2
Fix old not-reading-pep-308-right artifact.
Thomas Wouters <thomas@python.org>
parents:
36670
diff
changeset
|
1584 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
|
1585 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
|
1586 if (!body) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1587 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1588 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
|
1589 if (!expression) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1590 return NULL; |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1591 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
|
1592 if (!orelse) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1593 return NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1594 return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
1595 c->c_arena); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1596 } |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
1597 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1598 /* |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1599 Count the number of 'for' loops in a comprehension. |
| 35742 | 1600 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1601 Helper for ast_for_comprehension(). |
| 35742 | 1602 */ |
| 1603 | |
| 1604 static int | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1605 count_comp_fors(struct compiling *c, const node *n) |
| 35742 | 1606 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1607 int n_fors = 0; |
| 35742 | 1608 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1609 count_comp_for: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1610 n_fors++; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1611 REQ(n, comp_for); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1612 if (NCH(n) == 5) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1613 n = CHILD(n, 4); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1614 else |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1615 return n_fors; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1616 count_comp_iter: |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1617 REQ(n, comp_iter); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1618 n = CHILD(n, 0); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1619 if (TYPE(n) == comp_for) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1620 goto count_comp_for; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1621 else if (TYPE(n) == comp_if) { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1622 if (NCH(n) == 3) { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1623 n = CHILD(n, 2); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1624 goto count_comp_iter; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1625 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1626 else |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1627 return n_fors; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1628 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
1629 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1630 /* Should never be reached */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1631 PyErr_SetString(PyExc_SystemError, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1632 "logic error in count_comp_fors"); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1633 return -1; |
| 35742 | 1634 } |
| 1635 | |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1636 /* Count the number of 'if' statements in a comprehension. |
| 35742 | 1637 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1638 Helper for ast_for_comprehension(). |
| 35742 | 1639 */ |
| 1640 | |
| 1641 static int | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1642 count_comp_ifs(struct compiling *c, const node *n) |
| 35742 | 1643 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1644 int n_ifs = 0; |
| 35742 | 1645 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1646 while (1) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1647 REQ(n, comp_iter); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1648 if (TYPE(CHILD(n, 0)) == comp_for) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1649 return n_ifs; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1650 n = CHILD(n, 0); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1651 REQ(n, comp_if); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1652 n_ifs++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1653 if (NCH(n) == 2) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1654 return n_ifs; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1655 n = CHILD(n, 2); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
1656 } |
| 35742 | 1657 } |
| 1658 | |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1659 static asdl_seq * |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1660 ast_for_comprehension(struct compiling *c, const node *n) |
| 35742 | 1661 { |
| 1662 int i, n_fors; | |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1663 asdl_seq *comps; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1664 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1665 n_fors = count_comp_fors(c, n); |
| 35742 | 1666 if (n_fors == -1) |
| 1667 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
|
1668 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1669 comps = asdl_seq_new(n_fors, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1670 if (!comps) |
| 35742 | 1671 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
|
1672 |
| 35742 | 1673 for (i = 0; i < n_fors; i++) { |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1674 comprehension_ty comp; |
| 35742 | 1675 asdl_seq *t; |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1676 expr_ty expression, first; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1677 node *for_ch; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1678 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1679 REQ(n, comp_for); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1680 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1681 for_ch = CHILD(n, 1); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1682 t = ast_for_exprlist(c, for_ch, Store); |
|
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
|
1683 if (!t) |
| 35742 | 1684 return NULL; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1685 expression = ast_for_expr(c, CHILD(n, 3)); |
|
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
|
1686 if (!expression) |
| 35742 | 1687 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
|
1688 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1689 /* Check the # of children rather than the length of t, since |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1690 (x for x, in ...) has 1 element in t, but still requires a Tuple. */ |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1691 first = (expr_ty)asdl_seq_GET(t, 0); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1692 if (NCH(for_ch) == 1) |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1693 comp = comprehension(first, expression, NULL, c->c_arena); |
| 35742 | 1694 else |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1695 comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset, |
|
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1696 c->c_arena), |
|
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
1697 expression, NULL, c->c_arena); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1698 if (!comp) |
| 35742 | 1699 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
|
1700 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1701 if (NCH(n) == 5) { |
| 35742 | 1702 int j, n_ifs; |
| 1703 asdl_seq *ifs; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1704 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1705 n = CHILD(n, 4); |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1706 n_ifs = count_comp_ifs(c, 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
|
1707 if (n_ifs == -1) |
| 35742 | 1708 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
|
1709 |
|
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
|
1710 ifs = asdl_seq_new(n_ifs, 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
|
1711 if (!ifs) |
| 35742 | 1712 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
|
1713 |
| 35742 | 1714 for (j = 0; j < n_ifs; j++) { |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1715 REQ(n, comp_iter); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1716 n = CHILD(n, 0); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1717 REQ(n, comp_if); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1718 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1719 expression = ast_for_expr(c, CHILD(n, 1)); |
|
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
|
1720 if (!expression) |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
1721 return NULL; |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
1722 asdl_seq_SET(ifs, j, expression); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1723 if (NCH(n) == 3) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1724 n = CHILD(n, 2); |
| 35742 | 1725 } |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1726 /* on exit, must guarantee that n is a comp_for */ |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1727 if (TYPE(n) == comp_iter) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1728 n = CHILD(n, 0); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1729 comp->ifs = ifs; |
| 35742 | 1730 } |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1731 asdl_seq_SET(comps, i, comp); |
| 35742 | 1732 } |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1733 return comps; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1734 } |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1735 |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1736 static expr_ty |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1737 ast_for_itercomp(struct compiling *c, const node *n, int type) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1738 { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1739 /* testlist_comp: test ( comp_for | (',' test)* [','] ) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1740 argument: [test '='] test [comp_for] # Really [keyword '='] test */ |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1741 expr_ty elt; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1742 asdl_seq *comps; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1743 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1744 assert(NCH(n) > 1); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1745 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1746 elt = ast_for_expr(c, CHILD(n, 0)); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1747 if (!elt) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1748 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1749 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1750 comps = ast_for_comprehension(c, CHILD(n, 1)); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1751 if (!comps) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1752 return NULL; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1753 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1754 if (type == COMP_GENEXP) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1755 return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1756 else if (type == COMP_LISTCOMP) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1757 return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1758 else if (type == COMP_SETCOMP) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1759 return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1760 else |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1761 /* Should never happen */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1762 return NULL; |
| 35742 | 1763 } |
| 1764 | |
| 1765 static expr_ty | |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1766 ast_for_dictcomp(struct compiling *c, const node *n) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1767 { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1768 expr_ty key, value; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1769 asdl_seq *comps; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1770 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1771 assert(NCH(n) > 3); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1772 REQ(CHILD(n, 1), COLON); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1773 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1774 key = ast_for_expr(c, CHILD(n, 0)); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1775 if (!key) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1776 return NULL; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1777 value = ast_for_expr(c, CHILD(n, 2)); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1778 if (!value) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1779 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1780 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1781 comps = ast_for_comprehension(c, CHILD(n, 3)); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1782 if (!comps) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1783 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1784 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1785 return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1786 } |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1787 |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1788 static expr_ty |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1789 ast_for_genexp(struct compiling *c, const node *n) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1790 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1791 assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument)); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1792 return ast_for_itercomp(c, n, COMP_GENEXP); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1793 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1794 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1795 static expr_ty |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1796 ast_for_listcomp(struct compiling *c, const node *n) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1797 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1798 assert(TYPE(n) == (testlist_comp)); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1799 return ast_for_itercomp(c, n, COMP_LISTCOMP); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1800 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1801 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1802 static expr_ty |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1803 ast_for_setcomp(struct compiling *c, const node *n) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1804 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1805 assert(TYPE(n) == (dictorsetmaker)); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1806 return ast_for_itercomp(c, n, COMP_SETCOMP); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1807 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1808 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1809 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1810 static expr_ty |
| 35742 | 1811 ast_for_atom(struct compiling *c, const node *n) |
| 1812 { | |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1813 /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1814 | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+ |
|
41969
9d02a4adf574
Merged revisions 55631-55794 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41824
diff
changeset
|
1815 | '...' | 'None' | 'True' | 'False' |
| 35742 | 1816 */ |
| 1817 node *ch = CHILD(n, 0); | |
| 40894 | 1818 int bytesmode = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1819 |
| 35742 | 1820 switch (TYPE(ch)) { |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1821 case NAME: { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1822 /* All names start in Load context, but may later be |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1823 changed. */ |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1824 PyObject *name = NEW_IDENTIFIER(ch); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1825 if (!name) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1826 return NULL; |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1827 return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
1828 } |
| 35742 | 1829 case STRING: { |
| 40894 | 1830 PyObject *str = parsestrplus(c, n, &bytesmode); |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1831 if (!str) { |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
1832 if (PyErr_ExceptionMatches(PyExc_UnicodeError)) { |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1833 PyObject *type, *value, *tback, *errstr; |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1834 PyErr_Fetch(&type, &value, &tback); |
|
49797
f403d94157b2
Merged revisions 67320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49697
diff
changeset
|
1835 errstr = PyObject_Str(value); |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1836 if (errstr) { |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1837 char *s = ""; |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1838 char buf[128]; |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48515
diff
changeset
|
1839 s = _PyUnicode_AsString(errstr); |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1840 PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s); |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1841 ast_error(c, n, buf); |
|
49797
f403d94157b2
Merged revisions 67320 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49697
diff
changeset
|
1842 Py_DECREF(errstr); |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1843 } else { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
1844 ast_error(c, n, "(unicode error) unknown error"); |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1845 } |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1846 Py_DECREF(type); |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1847 Py_DECREF(value); |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1848 Py_XDECREF(tback); |
|
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1849 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1850 return NULL; |
|
42309
bd6acfdb47d2
Merged revisions 56301-56442 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
1851 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1852 PyArena_AddPyObject(c->c_arena, str); |
| 40894 | 1853 if (bytesmode) |
| 1854 return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena); | |
| 1855 else | |
| 1856 return Str(str, LINENO(n), n->n_col_offset, c->c_arena); | |
| 35742 | 1857 } |
| 1858 case NUMBER: { | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
1859 PyObject *pynum = parsenumber(c, STR(ch)); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1860 if (!pynum) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1861 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
|
1862 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1863 PyArena_AddPyObject(c->c_arena, pynum); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1864 return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1865 } |
|
41230
b1a18c7ed5ca
Make ELLIPSIS a separate token. This makes it a syntax error to write ". . ." for Ellipsis.
Georg Brandl <georg@python.org>
parents:
41226
diff
changeset
|
1866 case ELLIPSIS: /* Ellipsis */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1867 return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 1868 case LPAR: /* some parenthesized expressions */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1869 ch = CHILD(n, 1); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1870 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1871 if (TYPE(ch) == RPAR) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1872 return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1873 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1874 if (TYPE(ch) == yield_expr) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1875 return ast_for_expr(c, ch); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1876 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1877 /* testlist_comp: test ( comp_for | (',' test)* [','] ) */ |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1878 if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for)) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1879 return ast_for_genexp(c, ch); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1880 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1881 return ast_for_testlist(c, ch); |
| 35742 | 1882 case LSQB: /* list (or list comprehension) */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1883 ch = CHILD(n, 1); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1884 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1885 if (TYPE(ch) == RSQB) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1886 return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1887 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1888 REQ(ch, testlist_comp); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1889 if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1890 asdl_seq *elts = seq_for_testlist(c, ch); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1891 if (!elts) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1892 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
|
1893 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1894 return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1895 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1896 else |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1897 return ast_for_listcomp(c, ch); |
| 35742 | 1898 case LBRACE: { |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1899 /* dictorsetmaker: test ':' test (',' test ':' test)* [','] | |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1900 * test (gen_for | (',' test)* [',']) */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1901 int i, size; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1902 asdl_seq *keys, *values; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1903 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1904 ch = CHILD(n, 1); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1905 if (TYPE(ch) == RBRACE) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1906 /* it's an empty dict */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1907 return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1908 } else if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1909 /* it's a simple set */ |
|
41482
a5e410639e24
Make it compile with C89.
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1910 asdl_seq *elts; |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1911 size = (NCH(ch) + 1) / 2; /* +1 in case no trailing comma */ |
|
41482
a5e410639e24
Make it compile with C89.
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1912 elts = asdl_seq_new(size, c->c_arena); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1913 if (!elts) |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1914 return NULL; |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1915 for (i = 0; i < NCH(ch); i += 2) { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1916 expr_ty expression; |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1917 expression = ast_for_expr(c, CHILD(ch, i)); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1918 if (!expression) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1919 return NULL; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1920 asdl_seq_SET(elts, i / 2, expression); |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1921 } |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1922 return Set(elts, LINENO(n), n->n_col_offset, c->c_arena); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1923 } else if (TYPE(CHILD(ch, 1)) == comp_for) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1924 /* it's a set comprehension */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
1925 return ast_for_setcomp(c, ch); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1926 } else if (NCH(ch) > 3 && TYPE(CHILD(ch, 3)) == comp_for) { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
1927 return ast_for_dictcomp(c, ch); |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1928 } else { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1929 /* it's a dict */ |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1930 size = (NCH(ch) + 1) / 4; /* +1 in case no trailing comma */ |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1931 keys = asdl_seq_new(size, c->c_arena); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1932 if (!keys) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1933 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1934 |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1935 values = asdl_seq_new(size, c->c_arena); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1936 if (!values) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1937 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1938 |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1939 for (i = 0; i < NCH(ch); i += 4) { |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1940 expr_ty expression; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1941 |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1942 expression = ast_for_expr(c, CHILD(ch, i)); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1943 if (!expression) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1944 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
|
1945 |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1946 asdl_seq_SET(keys, i / 4, expression); |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
1947 |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1948 expression = ast_for_expr(c, CHILD(ch, i + 2)); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1949 if (!expression) |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1950 return NULL; |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1951 |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1952 asdl_seq_SET(values, i / 4, expression); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1953 } |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1954 return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39678
diff
changeset
|
1955 } |
| 35742 | 1956 } |
| 1957 default: | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1958 PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1959 return NULL; |
| 35742 | 1960 } |
| 1961 } | |
| 1962 | |
| 1963 static slice_ty | |
| 1964 ast_for_slice(struct compiling *c, const node *n) | |
| 1965 { | |
| 1966 node *ch; | |
| 1967 expr_ty lower = NULL, upper = NULL, step = NULL; | |
| 1968 | |
| 1969 REQ(n, subscript); | |
| 1970 | |
| 1971 /* | |
|
39783
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
1972 subscript: test | [test] ':' [test] [sliceop] |
| 35742 | 1973 sliceop: ':' [test] |
| 1974 */ | |
| 1975 ch = CHILD(n, 0); | |
| 1976 if (NCH(n) == 1 && TYPE(ch) == test) { | |
| 1977 /* 'step' variable hold no significance in terms of being used over | |
| 1978 other vars */ | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1979 step = ast_for_expr(c, ch); |
| 35742 | 1980 if (!step) |
| 1981 return NULL; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
1982 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1983 return Index(step, c->c_arena); |
| 35742 | 1984 } |
| 1985 | |
| 1986 if (TYPE(ch) == test) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1987 lower = ast_for_expr(c, ch); |
| 35742 | 1988 if (!lower) |
| 1989 return NULL; | |
| 1990 } | |
| 1991 | |
| 1992 /* If there's an upper bound it's in the second or third position. */ | |
| 1993 if (TYPE(ch) == COLON) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1994 if (NCH(n) > 1) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1995 node *n2 = CHILD(n, 1); |
| 35742 | 1996 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1997 if (TYPE(n2) == test) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1998 upper = ast_for_expr(c, n2); |
| 35742 | 1999 if (!upper) |
| 2000 return NULL; | |
| 2001 } | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2002 } |
| 35742 | 2003 } else if (NCH(n) > 2) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2004 node *n2 = CHILD(n, 2); |
| 35742 | 2005 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2006 if (TYPE(n2) == test) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2007 upper = ast_for_expr(c, n2); |
| 35742 | 2008 if (!upper) |
| 2009 return NULL; | |
| 2010 } | |
| 2011 } | |
| 2012 | |
| 2013 ch = CHILD(n, NCH(n) - 1); | |
| 2014 if (TYPE(ch) == sliceop) { | |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2015 if (NCH(ch) != 1) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2016 ch = CHILD(ch, 1); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2017 if (TYPE(ch) == test) { |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2018 step = ast_for_expr(c, ch); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2019 if (!step) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2020 return NULL; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2021 } |
| 35742 | 2022 } |
| 2023 } | |
| 2024 | |
|
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
|
2025 return Slice(lower, upper, step, c->c_arena); |
| 35742 | 2026 } |
| 2027 | |
| 2028 static expr_ty | |
| 2029 ast_for_binop(struct compiling *c, const node *n) | |
| 2030 { | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2031 /* Must account for a sequence of expressions. |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2032 How should A op B op C by represented? |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2033 BinOp(BinOp(A, op, B), op, C). |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2034 */ |
| 35742 | 2035 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2036 int i, nops; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2037 expr_ty expr1, expr2, result; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2038 operator_ty newoperator; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2039 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2040 expr1 = ast_for_expr(c, CHILD(n, 0)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2041 if (!expr1) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2042 return NULL; |
| 35742 | 2043 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2044 expr2 = ast_for_expr(c, CHILD(n, 2)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2045 if (!expr2) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2046 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2047 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2048 newoperator = get_operator(CHILD(n, 1)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2049 if (!newoperator) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2050 return NULL; |
| 35742 | 2051 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2052 result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2053 c->c_arena); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2054 if (!result) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2055 return NULL; |
| 35742 | 2056 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2057 nops = (NCH(n) - 1) / 2; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2058 for (i = 1; i < nops; i++) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2059 expr_ty tmp_result, tmp; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2060 const node* next_oper = CHILD(n, i * 2 + 1); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2061 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2062 newoperator = get_operator(next_oper); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2063 if (!newoperator) |
| 35742 | 2064 return NULL; |
| 2065 | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2066 tmp = ast_for_expr(c, CHILD(n, i * 2 + 2)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2067 if (!tmp) |
| 35742 | 2068 return NULL; |
| 2069 | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2070 tmp_result = BinOp(result, newoperator, tmp, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2071 LINENO(next_oper), next_oper->n_col_offset, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2072 c->c_arena); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2073 if (!tmp_result) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2074 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2075 result = tmp_result; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2076 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
2077 return result; |
| 35742 | 2078 } |
| 2079 | |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2080 static expr_ty |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2081 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
|
2082 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2083 /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2084 subscriptlist: subscript (',' subscript)* [','] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2085 subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2086 */ |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2087 REQ(n, trailer); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2088 if (TYPE(CHILD(n, 0)) == LPAR) { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2089 if (NCH(n) == 2) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2090 return Call(left_expr, NULL, NULL, NULL, NULL, LINENO(n), |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2091 n->n_col_offset, c->c_arena); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2092 else |
|
36679
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
2093 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
|
2094 } |
|
36679
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
2095 else if (TYPE(CHILD(n, 0)) == DOT ) { |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2096 PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2097 if (!attr_id) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2098 return NULL; |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2099 return Attribute(left_expr, attr_id, Load, |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2100 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
|
2101 } |
|
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
2102 else { |
|
e1391910b026
Simplify ast_for_trailer() in anticipation of more changes.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36676
diff
changeset
|
2103 REQ(CHILD(n, 0), LSQB); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2104 REQ(CHILD(n, 2), RSQB); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2105 n = CHILD(n, 1); |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2106 if (NCH(n) == 1) { |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2107 slice_ty slc = ast_for_slice(c, CHILD(n, 0)); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2108 if (!slc) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2109 return NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2110 return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2111 c->c_arena); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2112 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2113 else { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2114 /* The grammar is ambiguous here. The ambiguity is resolved |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2115 by treating the sequence as a tuple literal if there are |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2116 no slice features. |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2117 */ |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2118 int j; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2119 slice_ty slc; |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2120 expr_ty e; |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
2121 int simple = 1; |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2122 asdl_seq *slices, *elts; |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2123 slices = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2124 if (!slices) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2125 return NULL; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2126 for (j = 0; j < NCH(n); j += 2) { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2127 slc = ast_for_slice(c, CHILD(n, j)); |
|
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
|
2128 if (!slc) |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2129 return NULL; |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2130 if (slc->kind != Index_kind) |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
2131 simple = 0; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2132 asdl_seq_SET(slices, j / 2, slc); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2133 } |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2134 if (!simple) { |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2135 return Subscript(left_expr, ExtSlice(slices, c->c_arena), |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2136 Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2137 } |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2138 /* extract Index values and put them in a Tuple */ |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2139 elts = asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); |
|
36877
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36786
diff
changeset
|
2140 if (!elts) |
|
e9a7a2784e17
SF #1444030: Fix several potential defects found by Coverity.
Hye-Shik Chang <hyeshik@gmail.com>
parents:
36786
diff
changeset
|
2141 return NULL; |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2142 for (j = 0; j < asdl_seq_LEN(slices); ++j) { |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2143 slc = (slice_ty)asdl_seq_GET(slices, j); |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2144 assert(slc->kind == Index_kind && slc->v.Index.value); |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2145 asdl_seq_SET(elts, j, slc->v.Index.value); |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2146 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2147 e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
36686
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2148 if (!e) |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2149 return NULL; |
|
8611f39cd82b
Fix parsing of subscriptlist.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36682
diff
changeset
|
2150 return Subscript(left_expr, Index(e, c->c_arena), |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2151 Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2152 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2153 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2154 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2155 |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2156 static expr_ty |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2157 ast_for_factor(struct compiling *c, const node *n) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2158 { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2159 expr_ty expression; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2160 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2161 expression = ast_for_expr(c, CHILD(n, 1)); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2162 if (!expression) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2163 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2164 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2165 switch (TYPE(CHILD(n, 0))) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2166 case PLUS: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2167 return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2168 c->c_arena); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2169 case MINUS: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2170 return UnaryOp(USub, expression, LINENO(n), n->n_col_offset, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2171 c->c_arena); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2172 case TILDE: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2173 return UnaryOp(Invert, expression, LINENO(n), |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2174 n->n_col_offset, c->c_arena); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2175 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2176 PyErr_Format(PyExc_SystemError, "unhandled factor: %d", |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2177 TYPE(CHILD(n, 0))); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2178 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2179 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2180 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2181 static expr_ty |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2182 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
|
2183 { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2184 /* power: atom trailer* ('**' factor)* |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2185 */ |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2186 int i; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2187 expr_ty e, tmp; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2188 REQ(n, power); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2189 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
|
2190 if (!e) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2191 return NULL; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2192 if (NCH(n) == 1) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2193 return e; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2194 for (i = 1; i < NCH(n); i++) { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2195 node *ch = CHILD(n, i); |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2196 if (TYPE(ch) != trailer) |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2197 break; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2198 tmp = ast_for_trailer(c, ch, e); |
|
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
|
2199 if (!tmp) |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2200 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2201 tmp->lineno = e->lineno; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2202 tmp->col_offset = e->col_offset; |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2203 e = tmp; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2204 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2205 if (TYPE(CHILD(n, NCH(n) - 1)) == factor) { |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2206 expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1)); |
|
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
|
2207 if (!f) |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2208 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
|
2209 tmp = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, 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
|
2210 if (!tmp) |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2211 return NULL; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2212 e = tmp; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2213 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2214 return e; |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2215 } |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2216 |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2217 static expr_ty |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2218 ast_for_starred(struct compiling *c, const node *n) |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2219 { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2220 expr_ty tmp; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2221 REQ(n, star_expr); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2222 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2223 tmp = ast_for_expr(c, CHILD(n, 1)); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2224 if (!tmp) |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2225 return NULL; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2226 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2227 /* The Load context is changed later. */ |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2228 return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2229 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2230 |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2231 |
| 35742 | 2232 /* Do not name a variable 'expr'! Will cause a compile error. |
| 2233 */ | |
| 2234 | |
| 2235 static expr_ty | |
| 2236 ast_for_expr(struct compiling *c, const node *n) | |
| 2237 { | |
| 2238 /* 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
|
2239 test: or_test ['if' or_test 'else' test] | lambdef |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2240 test_nocond: or_test | lambdef_nocond |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2241 or_test: and_test ('or' and_test)* |
| 35742 | 2242 and_test: not_test ('and' not_test)* |
| 2243 not_test: 'not' not_test | comparison | |
| 2244 comparison: expr (comp_op expr)* | |
| 2245 expr: xor_expr ('|' xor_expr)* | |
| 2246 xor_expr: and_expr ('^' and_expr)* | |
| 2247 and_expr: shift_expr ('&' shift_expr)* | |
| 2248 shift_expr: arith_expr (('<<'|'>>') arith_expr)* | |
| 2249 arith_expr: term (('+'|'-') term)* | |
| 2250 term: factor (('*'|'/'|'%'|'//') factor)* | |
| 2251 factor: ('+'|'-'|'~') factor | power | |
| 2252 power: atom trailer* ('**' factor)* | |
| 2253 */ | |
| 2254 | |
| 2255 asdl_seq *seq; | |
| 2256 int i; | |
| 2257 | |
| 2258 loop: | |
| 2259 switch (TYPE(n)) { | |
| 2260 case test: | |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2261 case test_nocond: |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
2262 if (TYPE(CHILD(n, 0)) == lambdef || |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2263 TYPE(CHILD(n, 0)) == lambdef_nocond) |
| 35742 | 2264 return ast_for_lambdef(c, CHILD(n, 0)); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
2265 else if (NCH(n) > 1) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36444
diff
changeset
|
2266 return ast_for_ifexpr(c, n); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2267 /* Fallthrough */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2268 case or_test: |
| 35742 | 2269 case and_test: |
| 2270 if (NCH(n) == 1) { | |
| 2271 n = CHILD(n, 0); | |
| 2272 goto loop; | |
| 2273 } | |
|
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
|
2274 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 2275 if (!seq) |
| 2276 return NULL; | |
| 2277 for (i = 0; i < NCH(n); i += 2) { | |
| 2278 expr_ty e = ast_for_expr(c, CHILD(n, i)); | |
| 2279 if (!e) | |
| 2280 return NULL; | |
| 2281 asdl_seq_SET(seq, i / 2, e); | |
| 2282 } | |
| 2283 if (!strcmp(STR(CHILD(n, 1)), "and")) | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2284 return BoolOp(And, seq, LINENO(n), n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2285 c->c_arena); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2286 assert(!strcmp(STR(CHILD(n, 1)), "or")); |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2287 return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2288 case not_test: |
| 2289 if (NCH(n) == 1) { | |
| 2290 n = CHILD(n, 0); | |
| 2291 goto loop; | |
| 2292 } | |
| 2293 else { | |
| 2294 expr_ty expression = ast_for_expr(c, CHILD(n, 1)); | |
| 2295 if (!expression) | |
| 2296 return NULL; | |
| 2297 | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2298 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2299 c->c_arena); |
| 35742 | 2300 } |
| 2301 case comparison: | |
| 2302 if (NCH(n) == 1) { | |
| 2303 n = CHILD(n, 0); | |
| 2304 goto loop; | |
| 2305 } | |
| 2306 else { | |
| 2307 expr_ty expression; | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2308 asdl_int_seq *ops; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2309 asdl_seq *cmps; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2310 ops = asdl_int_seq_new(NCH(n) / 2, c->c_arena); |
| 35742 | 2311 if (!ops) |
| 2312 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
|
2313 cmps = asdl_seq_new(NCH(n) / 2, c->c_arena); |
| 35742 | 2314 if (!cmps) { |
| 2315 return NULL; | |
| 2316 } | |
| 2317 for (i = 1; i < NCH(n); i += 2) { | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2318 cmpop_ty newoperator; |
| 35742 | 2319 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2320 newoperator = ast_for_comp_op(c, CHILD(n, i)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2321 if (!newoperator) { |
| 35742 | 2322 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2323 } |
| 35742 | 2324 |
| 2325 expression = ast_for_expr(c, CHILD(n, i + 1)); | |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
2326 if (!expression) { |
| 35742 | 2327 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2328 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2329 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2330 asdl_seq_SET(ops, i / 2, newoperator); |
| 35742 | 2331 asdl_seq_SET(cmps, i / 2, expression); |
| 2332 } | |
| 2333 expression = ast_for_expr(c, CHILD(n, 0)); | |
|
35873
76ed7fdc9d85
Fix a whole bunch of potential memory leaks (and some real ones too)
Neal Norwitz <nnorwitz@gmail.com>
parents:
35870
diff
changeset
|
2334 if (!expression) { |
| 35742 | 2335 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2336 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2337 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2338 return Compare(expression, ops, cmps, LINENO(n), |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2339 n->n_col_offset, c->c_arena); |
| 35742 | 2340 } |
| 2341 break; | |
| 2342 | |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41698
diff
changeset
|
2343 case star_expr: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56951
diff
changeset
|
2344 return ast_for_starred(c, n); |
| 35742 | 2345 /* The next five cases all handle BinOps. The main body of code |
| 2346 is the same in each case, but the switch turned inside out to | |
| 2347 reuse the code for each type of operator. | |
| 2348 */ | |
| 2349 case expr: | |
| 2350 case xor_expr: | |
| 2351 case and_expr: | |
| 2352 case shift_expr: | |
| 2353 case arith_expr: | |
| 2354 case term: | |
| 2355 if (NCH(n) == 1) { | |
| 2356 n = CHILD(n, 0); | |
| 2357 goto loop; | |
| 2358 } | |
| 2359 return ast_for_binop(c, n); | |
| 2360 case yield_expr: { | |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2361 node *an = NULL; |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2362 node *en = NULL; |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2363 int is_from = 0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2364 expr_ty exp = NULL; |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2365 if (NCH(n) > 1) |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2366 an = CHILD(n, 1); /* yield_arg */ |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2367 if (an) { |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2368 en = CHILD(an, NCH(an) - 1); |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2369 if (NCH(an) == 2) { |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2370 is_from = 1; |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2371 exp = ast_for_expr(c, en); |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2372 } |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2373 else |
|
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2374 exp = ast_for_testlist(c, en); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2375 if (!exp) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2376 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2377 } |
|
74391
e1177b9167ce
make YieldFrom its own distinct from Yield (closes #13780)
Benjamin Peterson <benjamin@python.org>
parents:
74356
diff
changeset
|
2378 if (is_from) |
|
e1177b9167ce
make YieldFrom its own distinct from Yield (closes #13780)
Benjamin Peterson <benjamin@python.org>
parents:
74356
diff
changeset
|
2379 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2380 return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2381 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2382 case factor: |
| 35742 | 2383 if (NCH(n) == 1) { |
| 2384 n = CHILD(n, 0); | |
| 2385 goto loop; | |
| 2386 } | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2387 return ast_for_factor(c, n); |
|
35799
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2388 case power: |
|
842caa245917
Refactor code for translating "power" nodes.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35798
diff
changeset
|
2389 return ast_for_power(c, n); |
| 35742 | 2390 default: |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2391 PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); |
| 35742 | 2392 return NULL; |
| 2393 } | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2394 /* should never get here unless if error is set */ |
| 35742 | 2395 return NULL; |
| 2396 } | |
| 2397 | |
| 2398 static expr_ty | |
| 2399 ast_for_call(struct compiling *c, const node *n, expr_ty func) | |
| 2400 { | |
| 2401 /* | |
| 2402 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | |
| 2403 | '**' test) | |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2404 argument: [test '='] (test) [comp_for] # Really [keyword '='] test |
| 35742 | 2405 */ |
| 2406 | |
| 2407 int i, nargs, nkeywords, ngens; | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2408 asdl_seq *args; |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2409 asdl_seq *keywords; |
| 35742 | 2410 expr_ty vararg = NULL, kwarg = NULL; |
| 2411 | |
| 2412 REQ(n, arglist); | |
| 2413 | |
| 2414 nargs = 0; | |
| 2415 nkeywords = 0; | |
| 2416 ngens = 0; | |
| 2417 for (i = 0; i < NCH(n); i++) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2418 node *ch = CHILD(n, i); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2419 if (TYPE(ch) == argument) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2420 if (NCH(ch) == 1) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2421 nargs++; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2422 else if (TYPE(CHILD(ch, 1)) == comp_for) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2423 ngens++; |
| 35742 | 2424 else |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2425 nkeywords++; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2426 } |
| 35742 | 2427 } |
| 2428 if (ngens > 1 || (ngens && (nargs || nkeywords))) { | |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2429 ast_error(c, n, "Generator expression must be parenthesized " |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2430 "if not sole argument"); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2431 return NULL; |
| 35742 | 2432 } |
| 2433 | |
| 2434 if (nargs + nkeywords + ngens > 255) { | |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2435 ast_error(c, n, "more than 255 arguments"); |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2436 return NULL; |
| 35742 | 2437 } |
| 2438 | |
|
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
|
2439 args = asdl_seq_new(nargs + ngens, c->c_arena); |
| 35742 | 2440 if (!args) |
|
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
|
2441 return NULL; |
|
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
|
2442 keywords = asdl_seq_new(nkeywords, c->c_arena); |
| 35742 | 2443 if (!keywords) |
|
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
|
2444 return NULL; |
| 35742 | 2445 nargs = 0; |
| 2446 nkeywords = 0; | |
| 2447 for (i = 0; i < NCH(n); i++) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2448 node *ch = CHILD(n, i); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2449 if (TYPE(ch) == argument) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2450 expr_ty e; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2451 if (NCH(ch) == 1) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2452 if (nkeywords) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2453 ast_error(c, CHILD(ch, 0), |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2454 "non-keyword arg after keyword arg"); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2455 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2456 } |
|
48777
6abada05c313
allow keyword args after *args in a function call
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
2457 if (vararg) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2458 ast_error(c, CHILD(ch, 0), |
|
48777
6abada05c313
allow keyword args after *args in a function call
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
2459 "only named arguments may follow *expression"); |
|
6abada05c313
allow keyword args after *args in a function call
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
2460 return NULL; |
|
6abada05c313
allow keyword args after *args in a function call
Benjamin Peterson <benjamin@python.org>
parents:
48660
diff
changeset
|
2461 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2462 e = ast_for_expr(c, CHILD(ch, 0)); |
| 35742 | 2463 if (!e) |
|
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
|
2464 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2465 asdl_seq_SET(args, nargs++, e); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2466 } |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2467 else if (TYPE(CHILD(ch, 1)) == comp_for) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2468 e = ast_for_genexp(c, ch); |
| 35742 | 2469 if (!e) |
|
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
|
2470 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2471 asdl_seq_SET(args, nargs++, e); |
| 35742 | 2472 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2473 else { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2474 keyword_ty kw; |
|
48397
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2475 identifier key, tmp; |
|
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2476 int k; |
| 35742 | 2477 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2478 /* CHILD(ch, 0) is test, but must be an identifier? */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2479 e = ast_for_expr(c, CHILD(ch, 0)); |
| 35742 | 2480 if (!e) |
|
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
|
2481 return NULL; |
| 35742 | 2482 /* f(lambda x: x[0] = 3) ends up getting parsed with |
| 2483 * LHS test = lambda x: x[0], and RHS test = 3. | |
| 2484 * SF bug 132313 points out that complaining about a keyword | |
| 2485 * then is very confusing. | |
| 2486 */ | |
| 2487 if (e->kind == Lambda_kind) { | |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2488 ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment"); |
| 74462 | 2489 return NULL; |
| 35742 | 2490 } else if (e->kind != Name_kind) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2491 ast_error(c, CHILD(ch, 0), "keyword can't be an expression"); |
| 74462 | 2492 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2493 } else if (forbidden_name(c, e->v.Name.id, ch, 1)) { |
| 74462 | 2494 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2495 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2496 key = e->v.Name.id; |
|
48397
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2497 for (k = 0; k < nkeywords; k++) { |
|
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2498 tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg; |
|
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2499 if (!PyUnicode_Compare(tmp, key)) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2500 ast_error(c, CHILD(ch, 0), "keyword argument repeated"); |
|
48397
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2501 return NULL; |
|
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2502 } |
|
42309437f1ca
Merged revisions 64622 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48330
diff
changeset
|
2503 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2504 e = ast_for_expr(c, CHILD(ch, 2)); |
| 35742 | 2505 if (!e) |
|
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
|
2506 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2507 kw = keyword(key, e, c->c_arena); |
| 35742 | 2508 if (!kw) |
|
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
|
2509 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2510 asdl_seq_SET(keywords, nkeywords++, kw); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2511 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2512 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2513 else if (TYPE(ch) == STAR) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2514 vararg = ast_for_expr(c, CHILD(n, i+1)); |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45448
diff
changeset
|
2515 if (!vararg) |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45448
diff
changeset
|
2516 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2517 i++; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2518 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2519 else if (TYPE(ch) == DOUBLESTAR) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2520 kwarg = ast_for_expr(c, CHILD(n, i+1)); |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45448
diff
changeset
|
2521 if (!kwarg) |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45448
diff
changeset
|
2522 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2523 i++; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2524 } |
| 35742 | 2525 } |
| 2526 | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2527 return Call(func, args, keywords, vararg, kwarg, func->lineno, func->col_offset, c->c_arena); |
| 35742 | 2528 } |
| 2529 | |
| 2530 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
|
2531 ast_for_testlist(struct compiling *c, const node* n) |
| 35742 | 2532 { |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2533 /* testlist_comp: test (comp_for | (',' test)* [',']) */ |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2534 /* testlist: test (',' test)* [','] */ |
| 35742 | 2535 assert(NCH(n) > 0); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2536 if (TYPE(n) == testlist_comp) { |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2537 if (NCH(n) > 1) |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41235
diff
changeset
|
2538 assert(TYPE(CHILD(n, 1)) != comp_for); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2539 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2540 else { |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2541 assert(TYPE(n) == testlist || |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
2542 TYPE(n) == testlist_star_expr); |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2543 } |
| 35742 | 2544 if (NCH(n) == 1) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2545 return ast_for_expr(c, CHILD(n, 0)); |
| 35742 | 2546 else { |
| 2547 asdl_seq *tmp = seq_for_testlist(c, n); | |
| 2548 if (!tmp) | |
| 2549 return NULL; | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2550 return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2551 } |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2552 } |
|
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2553 |
| 35742 | 2554 static stmt_ty |
| 2555 ast_for_expr_stmt(struct compiling *c, const node *n) | |
| 2556 { | |
| 2557 REQ(n, expr_stmt); | |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56951
diff
changeset
|
2558 /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) |
| 35742 | 2559 | ('=' (yield_expr|testlist))*) |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
2560 testlist_star_expr: (test|star_expr) (',' test|star_expr)* [','] |
| 35742 | 2561 augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2562 | '<<=' | '>>=' | '**=' | '//=' |
| 35742 | 2563 test: ... here starts the operator precendence dance |
| 2564 */ | |
| 2565 | |
| 2566 if (NCH(n) == 1) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2567 expr_ty e = ast_for_testlist(c, CHILD(n, 0)); |
| 35742 | 2568 if (!e) |
| 2569 return NULL; | |
| 2570 | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2571 return Expr(e, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2572 } |
| 2573 else if (TYPE(CHILD(n, 1)) == augassign) { | |
| 2574 expr_ty expr1, expr2; | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2575 operator_ty newoperator; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2576 node *ch = CHILD(n, 0); |
| 35742 | 2577 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2578 expr1 = ast_for_testlist(c, ch); |
| 35742 | 2579 if (!expr1) |
| 2580 return NULL; | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2581 if(!set_context(c, expr1, Store, ch)) |
|
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2582 return NULL; |
|
56363
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2583 /* set_context checks that most expressions are not the left side. |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2584 Augmented assignments can only have a name, a subscript, or an |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2585 attribute on the left, though, so we have to explicitly check for |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2586 those. */ |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2587 switch (expr1->kind) { |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2588 case Name_kind: |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2589 case Attribute_kind: |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2590 case Subscript_kind: |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2591 break; |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2592 default: |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2593 ast_error(c, ch, "illegal expression for augmented assignment"); |
|
56363
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2594 return NULL; |
|
4f49bd2e7c58
Merged revisions 75224 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2595 } |
| 35742 | 2596 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2597 ch = CHILD(n, 2); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2598 if (TYPE(ch) == testlist) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2599 expr2 = ast_for_testlist(c, ch); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2600 else |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2601 expr2 = ast_for_expr(c, ch); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2602 if (!expr2) |
| 35742 | 2603 return NULL; |
| 2604 | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2605 newoperator = ast_for_augassign(c, CHILD(n, 1)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2606 if (!newoperator) |
| 35742 | 2607 return NULL; |
| 2608 | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2609 return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2610 } |
| 2611 else { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2612 int i; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2613 asdl_seq *targets; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2614 node *value; |
| 35742 | 2615 expr_ty expression; |
| 2616 | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2617 /* a normal assignment */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2618 REQ(CHILD(n, 1), EQUAL); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2619 targets = asdl_seq_new(NCH(n) / 2, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2620 if (!targets) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2621 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2622 for (i = 0; i < NCH(n) - 2; i += 2) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2623 expr_ty e; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2624 node *ch = CHILD(n, i); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2625 if (TYPE(ch) == yield_expr) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2626 ast_error(c, ch, "assignment to yield expression not possible"); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2627 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2628 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2629 e = ast_for_testlist(c, ch); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
2630 if (!e) |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
2631 return NULL; |
| 35742 | 2632 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2633 /* set context to assign */ |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2634 if (!set_context(c, e, Store, CHILD(n, i))) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2635 return NULL; |
| 35742 | 2636 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2637 asdl_seq_SET(targets, i / 2, e); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2638 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2639 value = CHILD(n, NCH(n) - 1); |
|
56237
7ee140b7ef93
fix an ambiguity in the grammar from the implementation of extended unpacking
Benjamin Peterson <benjamin@python.org>
parents:
55912
diff
changeset
|
2640 if (TYPE(value) == testlist_star_expr) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2641 expression = ast_for_testlist(c, value); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2642 else |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2643 expression = ast_for_expr(c, value); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2644 if (!expression) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2645 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2646 return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2647 } |
| 2648 } | |
| 2649 | |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2650 |
| 35742 | 2651 static asdl_seq * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
2652 ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context) |
| 35742 | 2653 { |
| 2654 asdl_seq *seq; | |
| 2655 int i; | |
| 2656 expr_ty e; | |
| 2657 | |
| 2658 REQ(n, exprlist); | |
| 2659 | |
|
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
|
2660 seq = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
| 35742 | 2661 if (!seq) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2662 return NULL; |
| 35742 | 2663 for (i = 0; i < NCH(n); i += 2) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2664 e = ast_for_expr(c, CHILD(n, i)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2665 if (!e) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2666 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2667 asdl_seq_SET(seq, i / 2, e); |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
2668 if (context && !set_context(c, e, context, CHILD(n, i))) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2669 return NULL; |
| 35742 | 2670 } |
| 2671 return seq; | |
| 2672 } | |
| 2673 | |
| 2674 static stmt_ty | |
| 2675 ast_for_del_stmt(struct compiling *c, const node *n) | |
| 2676 { | |
| 2677 asdl_seq *expr_list; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2678 |
| 35742 | 2679 /* del_stmt: 'del' exprlist */ |
| 2680 REQ(n, del_stmt); | |
| 2681 | |
| 2682 expr_list = ast_for_exprlist(c, CHILD(n, 1), Del); | |
| 2683 if (!expr_list) | |
| 2684 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
|
2685 return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2686 } |
| 2687 | |
| 2688 static stmt_ty | |
| 2689 ast_for_flow_stmt(struct compiling *c, const node *n) | |
| 2690 { | |
| 2691 /* | |
| 2692 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | |
| 2693 | yield_stmt | |
| 2694 break_stmt: 'break' | |
| 2695 continue_stmt: 'continue' | |
| 2696 return_stmt: 'return' [testlist] | |
| 2697 yield_stmt: yield_expr | |
|
74356
d64ac9ab4cd0
Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents:
74354
diff
changeset
|
2698 yield_expr: 'yield' testlist | 'yield' 'from' test |
| 35742 | 2699 raise_stmt: 'raise' [test [',' test [',' test]]] |
| 2700 */ | |
| 2701 node *ch; | |
| 2702 | |
| 2703 REQ(n, flow_stmt); | |
| 2704 ch = CHILD(n, 0); | |
| 2705 switch (TYPE(ch)) { | |
| 2706 case break_stmt: | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2707 return Break(LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2708 case continue_stmt: |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2709 return Continue(LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2710 case yield_stmt: { /* will reduce to yield_expr */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2711 expr_ty exp = ast_for_expr(c, CHILD(ch, 0)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2712 if (!exp) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2713 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
|
2714 return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2715 } |
| 2716 case return_stmt: | |
| 2717 if (NCH(ch) == 1) | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2718 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2719 else { |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
2720 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1)); |
| 35742 | 2721 if (!expression) |
| 2722 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
|
2723 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2724 } |
| 2725 case raise_stmt: | |
| 2726 if (NCH(ch) == 1) | |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2727 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena); |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2728 else if (NCH(ch) >= 2) { |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2729 expr_ty cause = NULL; |
| 35742 | 2730 expr_ty expression = ast_for_expr(c, CHILD(ch, 1)); |
| 2731 if (!expression) | |
| 2732 return NULL; | |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2733 if (NCH(ch) == 4) { |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2734 cause = ast_for_expr(c, CHILD(ch, 3)); |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2735 if (!cause) |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2736 return NULL; |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2737 } |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
42597
diff
changeset
|
2738 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2739 } |
| 2740 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2741 PyErr_Format(PyExc_SystemError, |
| 35742 | 2742 "unexpected flow_stmt: %d", TYPE(ch)); |
| 2743 return NULL; | |
| 2744 } | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2745 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2746 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
|
2747 return NULL; |
| 35742 | 2748 } |
| 2749 | |
| 2750 static alias_ty | |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2751 alias_for_import_name(struct compiling *c, const node *n, int store) |
| 35742 | 2752 { |
| 2753 /* | |
|
36742
658f8ff2a442
Make 'as' an actual keyword when with's future statement is used. Not
Thomas Wouters <thomas@python.org>
parents:
36718
diff
changeset
|
2754 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
|
2755 dotted_as_name: dotted_name ['as' NAME] |
| 35742 | 2756 dotted_name: NAME ('.' NAME)* |
| 2757 */ | |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2758 identifier 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
|
2759 |
| 35742 | 2760 loop: |
| 2761 switch (TYPE(n)) { | |
| 70916 | 2762 case import_as_name: { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2763 node *name_node = CHILD(n, 0); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2764 str = NULL; |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2765 name = NEW_IDENTIFIER(name_node); |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2766 if (!name) |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2767 return NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2768 if (NCH(n) == 3) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2769 node *str_node = CHILD(n, 2); |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2770 str = NEW_IDENTIFIER(str_node); |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2771 if (!str) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2772 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2773 if (store && forbidden_name(c, str, str_node, 0)) |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2774 return NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
2775 } |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2776 else { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2777 if (forbidden_name(c, name, name_node, 0)) |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2778 return NULL; |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2779 } |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2780 return alias(name, str, c->c_arena); |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2781 } |
| 35742 | 2782 case dotted_as_name: |
| 2783 if (NCH(n) == 1) { | |
| 2784 n = CHILD(n, 0); | |
| 2785 goto loop; | |
| 2786 } | |
| 2787 else { | |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2788 node *asname_node = CHILD(n, 2); |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2789 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0); |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
2790 if (!a) |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
2791 return NULL; |
| 35742 | 2792 assert(!a->asname); |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2793 a->asname = NEW_IDENTIFIER(asname_node); |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2794 if (!a->asname) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2795 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2796 if (forbidden_name(c, a->asname, asname_node, 0)) |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2797 return NULL; |
| 35742 | 2798 return a; |
| 2799 } | |
| 2800 break; | |
| 2801 case dotted_name: | |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2802 if (NCH(n) == 1) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2803 node *name_node = CHILD(n, 0); |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2804 name = NEW_IDENTIFIER(name_node); |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2805 if (!name) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2806 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2807 if (store && forbidden_name(c, name, name_node, 0)) |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2808 return NULL; |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2809 return alias(name, NULL, c->c_arena); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
2810 } |
| 35742 | 2811 else { |
| 2812 /* Create a string of the form "a.b.c" */ | |
|
36242
0f5189607264
Repair bizarre indentation created by VC 7.1.
Tim Peters <tim.peters@gmail.com>
parents:
36241
diff
changeset
|
2813 int i; |
|
36241
557e9b6ee7e1
alias_for_import_name(): Dueling compiler warnings ;-)
Tim Peters <tim.peters@gmail.com>
parents:
36231
diff
changeset
|
2814 size_t len; |
| 35742 | 2815 char *s; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2816 PyObject *uni; |
| 35742 | 2817 |
| 2818 len = 0; | |
| 2819 for (i = 0; i < NCH(n); i += 2) | |
| 2820 /* length of string plus one for the dot */ | |
| 2821 len += strlen(STR(CHILD(n, i))) + 1; | |
| 2822 len--; /* the last name doesn't have a dot */ | |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
2823 str = PyBytes_FromStringAndSize(NULL, len); |
| 35742 | 2824 if (!str) |
| 2825 return NULL; | |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
2826 s = PyBytes_AS_STRING(str); |
| 35742 | 2827 if (!s) |
| 2828 return NULL; | |
| 2829 for (i = 0; i < NCH(n); i += 2) { | |
| 2830 char *sch = STR(CHILD(n, i)); | |
| 2831 strcpy(s, STR(CHILD(n, i))); | |
| 2832 s += strlen(sch); | |
| 2833 *s++ = '.'; | |
| 2834 } | |
| 2835 --s; | |
| 2836 *s = '\0'; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2837 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2838 PyBytes_GET_SIZE(str), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2839 NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2840 Py_DECREF(str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2841 if (!uni) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2842 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2843 str = uni; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
2844 PyUnicode_InternInPlace(&str); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2845 PyArena_AddPyObject(c->c_arena, str); |
|
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
|
2846 return alias(str, NULL, c->c_arena); |
| 35742 | 2847 } |
| 2848 break; | |
| 2849 case STAR: | |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41969
diff
changeset
|
2850 str = PyUnicode_InternFromString("*"); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2851 PyArena_AddPyObject(c->c_arena, str); |
|
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
|
2852 return alias(str, NULL, c->c_arena); |
| 35742 | 2853 default: |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2854 PyErr_Format(PyExc_SystemError, |
| 35742 | 2855 "unexpected import name: %d", TYPE(n)); |
| 2856 return NULL; | |
| 2857 } | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2858 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2859 PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); |
| 35742 | 2860 return NULL; |
| 2861 } | |
| 2862 | |
| 2863 static stmt_ty | |
| 2864 ast_for_import_stmt(struct compiling *c, const node *n) | |
| 2865 { | |
| 2866 /* | |
| 2867 import_stmt: import_name | import_from | |
| 2868 import_name: 'import' dotted_as_names | |
|
41235
6c8c33a43a15
"from ... import x" should not be a syntax error... make
Georg Brandl <georg@python.org>
parents:
41230
diff
changeset
|
2869 import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+) |
|
6c8c33a43a15
"from ... import x" should not be a syntax error... make
Georg Brandl <georg@python.org>
parents:
41230
diff
changeset
|
2870 'import' ('*' | '(' import_as_names ')' | import_as_names) |
| 35742 | 2871 */ |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2872 int lineno; |
|
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2873 int col_offset; |
| 35742 | 2874 int i; |
| 2875 asdl_seq *aliases; | |
| 2876 | |
| 2877 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
|
2878 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
|
2879 col_offset = n->n_col_offset; |
| 35742 | 2880 n = CHILD(n, 0); |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2881 if (TYPE(n) == import_name) { |
| 35742 | 2882 n = CHILD(n, 1); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2883 REQ(n, dotted_as_names); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2884 aliases = asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2885 if (!aliases) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2886 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2887 for (i = 0; i < NCH(n); i += 2) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2888 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2889 if (!import_alias) |
| 35742 | 2890 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2891 asdl_seq_SET(aliases, i / 2, import_alias); |
| 35742 | 2892 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2893 return Import(aliases, lineno, col_offset, c->c_arena); |
| 35742 | 2894 } |
|
36682
52cbc447e1c9
And some more cleanup.
Thomas Wouters <thomas@python.org>
parents:
36681
diff
changeset
|
2895 else if (TYPE(n) == import_from) { |
| 35742 | 2896 int n_children; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2897 int idx, ndots = 0; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2898 alias_ty mod = NULL; |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2899 identifier modname = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2900 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2901 /* Count the number of dots (for relative imports) and check for the |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2902 optional module name */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2903 for (idx = 1; idx < NCH(n); idx++) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2904 if (TYPE(CHILD(n, idx)) == dotted_name) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2905 mod = alias_for_import_name(c, CHILD(n, idx), 0); |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2906 if (!mod) |
|
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2907 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2908 idx++; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2909 break; |
|
41235
6c8c33a43a15
"from ... import x" should not be a syntax error... make
Georg Brandl <georg@python.org>
parents:
41230
diff
changeset
|
2910 } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
2911 /* three consecutive dots are tokenized as one ELLIPSIS */ |
|
41235
6c8c33a43a15
"from ... import x" should not be a syntax error... make
Georg Brandl <georg@python.org>
parents:
41230
diff
changeset
|
2912 ndots += 3; |
|
6c8c33a43a15
"from ... import x" should not be a syntax error... make
Georg Brandl <georg@python.org>
parents:
41230
diff
changeset
|
2913 continue; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2914 } else if (TYPE(CHILD(n, idx)) != DOT) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2915 break; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2916 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2917 ndots++; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2918 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2919 idx++; /* skip over the 'import' keyword */ |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2920 switch (TYPE(CHILD(n, idx))) { |
|
36681
e9f0db429f2b
Clean up from-import handling.
Thomas Wouters <thomas@python.org>
parents:
36679
diff
changeset
|
2921 case STAR: |
|
e9f0db429f2b
Clean up from-import handling.
Thomas Wouters <thomas@python.org>
parents:
36679
diff
changeset
|
2922 /* from ... import * */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2923 n = CHILD(n, idx); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2924 n_children = 1; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2925 break; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2926 case LPAR: |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2927 /* from ... import (x, y, z) */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2928 n = CHILD(n, idx + 1); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2929 n_children = NCH(n); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2930 break; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2931 case import_as_names: |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2932 /* from ... import x, y, z */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2933 n = CHILD(n, idx); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2934 n_children = NCH(n); |
|
36681
e9f0db429f2b
Clean up from-import handling.
Thomas Wouters <thomas@python.org>
parents:
36679
diff
changeset
|
2935 if (n_children % 2 == 0) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2936 ast_error(c, n, "trailing comma not allowed without" |
| 35742 | 2937 " surrounding parentheses"); |
| 2938 return NULL; | |
| 2939 } | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2940 break; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2941 default: |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
2942 ast_error(c, n, "Unexpected node-type in from-import"); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2943 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2944 } |
| 35742 | 2945 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2946 aliases = asdl_seq_new((n_children + 1) / 2, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2947 if (!aliases) |
| 35742 | 2948 return NULL; |
| 2949 | |
| 2950 /* handle "from ... import *" special b/c there's no children */ | |
|
36681
e9f0db429f2b
Clean up from-import handling.
Thomas Wouters <thomas@python.org>
parents:
36679
diff
changeset
|
2951 if (TYPE(n) == STAR) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2952 alias_ty import_alias = alias_for_import_name(c, n, 1); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
2953 if (!import_alias) |
| 35742 | 2954 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2955 asdl_seq_SET(aliases, 0, import_alias); |
| 35742 | 2956 } |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2957 else { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2958 for (i = 0; i < NCH(n); i += 2) { |
|
54918
0704f15b4682
Merged revisions 73376,73393,73398,73400,73404-73405,73409,73419-73421,73432,73457,73460,73485-73486,73488-73489,73501-73502,73513-73514 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54703
diff
changeset
|
2959 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1); |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2960 if (!import_alias) |
|
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2961 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2962 asdl_seq_SET(aliases, i / 2, import_alias); |
|
36718
45e6f901902c
Remove asdl_seq_APPEND() and simplify asdl seq implementation.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36712
diff
changeset
|
2963 } |
| 35742 | 2964 } |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2965 if (mod != NULL) |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2966 modname = mod->name; |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2967 return ImportFrom(modname, aliases, ndots, lineno, col_offset, |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36695
diff
changeset
|
2968 c->c_arena); |
| 35742 | 2969 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
2970 PyErr_Format(PyExc_SystemError, |
| 35742 | 2971 "unknown import statement: starts with command '%s'", |
| 2972 STR(CHILD(n, 0))); | |
| 2973 return NULL; | |
| 2974 } | |
| 2975 | |
| 2976 static stmt_ty | |
| 2977 ast_for_global_stmt(struct compiling *c, const node *n) | |
| 2978 { | |
| 2979 /* global_stmt: 'global' NAME (',' NAME)* */ | |
| 2980 identifier name; | |
| 2981 asdl_seq *s; | |
| 2982 int i; | |
| 2983 | |
| 2984 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
|
2985 s = asdl_seq_new(NCH(n) / 2, c->c_arena); |
| 35742 | 2986 if (!s) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2987 return NULL; |
| 35742 | 2988 for (i = 1; i < NCH(n); i += 2) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2989 name = NEW_IDENTIFIER(CHILD(n, i)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2990 if (!name) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2991 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2992 asdl_seq_SET(s, i / 2, name); |
| 35742 | 2993 } |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
2994 return Global(s, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 2995 } |
| 2996 | |
| 2997 static stmt_ty | |
|
40965
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
2998 ast_for_nonlocal_stmt(struct compiling *c, const node *n) |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
2999 { |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3000 /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */ |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3001 identifier name; |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3002 asdl_seq *s; |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3003 int i; |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3004 |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3005 REQ(n, nonlocal_stmt); |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3006 s = asdl_seq_new(NCH(n) / 2, c->c_arena); |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3007 if (!s) |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3008 return NULL; |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3009 for (i = 1; i < NCH(n); i += 2) { |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3010 name = NEW_IDENTIFIER(CHILD(n, i)); |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3011 if (!name) |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3012 return NULL; |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3013 asdl_seq_SET(s, i / 2, name); |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3014 } |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3015 return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena); |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3016 } |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3017 |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3018 static stmt_ty |
| 35742 | 3019 ast_for_assert_stmt(struct compiling *c, const node *n) |
| 3020 { | |
| 3021 /* assert_stmt: 'assert' test [',' test] */ | |
| 3022 REQ(n, assert_stmt); | |
| 3023 if (NCH(n) == 2) { | |
| 3024 expr_ty expression = ast_for_expr(c, CHILD(n, 1)); | |
| 3025 if (!expression) | |
| 3026 return NULL; | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3027 return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3028 } |
| 3029 else if (NCH(n) == 4) { | |
| 3030 expr_ty expr1, expr2; | |
| 3031 | |
| 3032 expr1 = ast_for_expr(c, CHILD(n, 1)); | |
| 3033 if (!expr1) | |
| 3034 return NULL; | |
| 3035 expr2 = ast_for_expr(c, CHILD(n, 3)); | |
| 3036 if (!expr2) | |
| 3037 return NULL; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3038 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3039 return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3040 } |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
3041 PyErr_Format(PyExc_SystemError, |
| 35742 | 3042 "improper number of parts to 'assert' statement: %d", |
| 3043 NCH(n)); | |
| 3044 return NULL; | |
| 3045 } | |
| 3046 | |
| 3047 static asdl_seq * | |
| 3048 ast_for_suite(struct compiling *c, const node *n) | |
| 3049 { | |
| 3050 /* 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
|
3051 asdl_seq *seq; |
| 35742 | 3052 stmt_ty s; |
| 3053 int i, total, num, end, pos = 0; | |
| 3054 node *ch; | |
| 3055 | |
| 3056 REQ(n, suite); | |
| 3057 | |
| 3058 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
|
3059 seq = asdl_seq_new(total, c->c_arena); |
| 35742 | 3060 if (!seq) |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3061 return NULL; |
| 35742 | 3062 if (TYPE(CHILD(n, 0)) == simple_stmt) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3063 n = CHILD(n, 0); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3064 /* simple_stmt always ends with a NEWLINE, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3065 and may have a trailing SEMI |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3066 */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3067 end = NCH(n) - 1; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3068 if (TYPE(CHILD(n, end - 1)) == SEMI) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3069 end--; |
| 35742 | 3070 /* loop by 2 to skip semi-colons */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3071 for (i = 0; i < end; i += 2) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3072 ch = CHILD(n, i); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3073 s = ast_for_stmt(c, ch); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3074 if (!s) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3075 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3076 asdl_seq_SET(seq, pos++, s); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3077 } |
| 35742 | 3078 } |
| 3079 else { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3080 for (i = 2; i < (NCH(n) - 1); i++) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3081 ch = CHILD(n, i); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3082 REQ(ch, stmt); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3083 num = num_stmts(ch); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3084 if (num == 1) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3085 /* small_stmt or compound_stmt with only one child */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3086 s = ast_for_stmt(c, ch); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3087 if (!s) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3088 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3089 asdl_seq_SET(seq, pos++, s); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3090 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3091 else { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3092 int j; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3093 ch = CHILD(ch, 0); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3094 REQ(ch, simple_stmt); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3095 for (j = 0; j < NCH(ch); j += 2) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3096 /* statement terminates with a semi-colon ';' */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3097 if (NCH(CHILD(ch, j)) == 0) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3098 assert((j + 1) == NCH(ch)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3099 break; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3100 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3101 s = ast_for_stmt(c, CHILD(ch, j)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3102 if (!s) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3103 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3104 asdl_seq_SET(seq, pos++, s); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3105 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3106 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3107 } |
| 35742 | 3108 } |
| 3109 assert(pos == seq->size); | |
| 3110 return seq; | |
| 3111 } | |
| 3112 | |
| 3113 static stmt_ty | |
| 3114 ast_for_if_stmt(struct compiling *c, const node *n) | |
| 3115 { | |
| 3116 /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)* | |
| 3117 ['else' ':' suite] | |
| 3118 */ | |
| 3119 char *s; | |
| 3120 | |
| 3121 REQ(n, if_stmt); | |
| 3122 | |
| 3123 if (NCH(n) == 4) { | |
| 3124 expr_ty expression; | |
| 3125 asdl_seq *suite_seq; | |
| 3126 | |
| 3127 expression = ast_for_expr(c, CHILD(n, 1)); | |
| 3128 if (!expression) | |
| 3129 return NULL; | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3130 suite_seq = ast_for_suite(c, CHILD(n, 3)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3131 if (!suite_seq) |
| 35742 | 3132 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3133 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3134 return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3135 c->c_arena); |
| 35742 | 3136 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3137 |
| 35742 | 3138 s = STR(CHILD(n, 4)); |
| 3139 /* s[2], the third character in the string, will be | |
| 3140 's' for el_s_e, or | |
| 3141 'i' for el_i_f | |
| 3142 */ | |
| 3143 if (s[2] == 's') { | |
| 3144 expr_ty expression; | |
| 3145 asdl_seq *seq1, *seq2; | |
| 3146 | |
| 3147 expression = ast_for_expr(c, CHILD(n, 1)); | |
| 3148 if (!expression) | |
| 3149 return NULL; | |
| 3150 seq1 = ast_for_suite(c, CHILD(n, 3)); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3151 if (!seq1) |
| 35742 | 3152 return NULL; |
| 3153 seq2 = 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
|
3154 if (!seq2) |
| 35742 | 3155 return NULL; |
| 3156 | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3157 return If(expression, seq1, seq2, LINENO(n), n->n_col_offset, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3158 c->c_arena); |
| 35742 | 3159 } |
| 3160 else if (s[2] == 'i') { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3161 int i, n_elif, has_else = 0; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3162 expr_ty expression; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3163 asdl_seq *suite_seq; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3164 asdl_seq *orelse = NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3165 n_elif = NCH(n) - 4; |
| 35742 | 3166 /* must reference the child n_elif+1 since 'else' token is third, |
| 3167 not fourth, child from the end. */ | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3168 if (TYPE(CHILD(n, (n_elif + 1))) == NAME |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3169 && STR(CHILD(n, (n_elif + 1)))[2] == 's') { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3170 has_else = 1; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3171 n_elif -= 3; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3172 } |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3173 n_elif /= 4; |
| 35742 | 3174 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3175 if (has_else) { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3176 asdl_seq *suite_seq2; |
| 35742 | 3177 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3178 orelse = asdl_seq_new(1, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3179 if (!orelse) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3180 return NULL; |
| 35742 | 3181 expression = ast_for_expr(c, CHILD(n, NCH(n) - 6)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3182 if (!expression) |
| 35742 | 3183 return NULL; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3184 suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3185 if (!suite_seq) |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3186 return NULL; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3187 suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3188 if (!suite_seq2) |
| 35742 | 3189 return NULL; |
| 3190 | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3191 asdl_seq_SET(orelse, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3192 If(expression, suite_seq, suite_seq2, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3193 LINENO(CHILD(n, NCH(n) - 6)), |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3194 CHILD(n, NCH(n) - 6)->n_col_offset, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3195 c->c_arena)); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3196 /* the just-created orelse handled the last elif */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3197 n_elif--; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3198 } |
| 35742 | 3199 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3200 for (i = 0; i < n_elif; i++) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3201 int off = 5 + (n_elif - i - 1) * 4; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3202 asdl_seq *newobj = asdl_seq_new(1, c->c_arena); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3203 if (!newobj) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3204 return NULL; |
| 35742 | 3205 expression = ast_for_expr(c, CHILD(n, off)); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3206 if (!expression) |
| 35742 | 3207 return NULL; |
| 3208 suite_seq = ast_for_suite(c, CHILD(n, off + 2)); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3209 if (!suite_seq) |
| 35742 | 3210 return NULL; |
| 3211 | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3212 asdl_seq_SET(newobj, 0, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3213 If(expression, suite_seq, orelse, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3214 LINENO(CHILD(n, off)), |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3215 CHILD(n, off)->n_col_offset, c->c_arena)); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3216 orelse = newobj; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3217 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3218 expression = ast_for_expr(c, CHILD(n, 1)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3219 if (!expression) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3220 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3221 suite_seq = ast_for_suite(c, CHILD(n, 3)); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3222 if (!suite_seq) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3223 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3224 return If(expression, suite_seq, orelse, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3225 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3226 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3227 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3228 PyErr_Format(PyExc_SystemError, |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3229 "unexpected token in 'if' statement: %s", s); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3230 return NULL; |
| 35742 | 3231 } |
| 3232 | |
| 3233 static stmt_ty | |
| 3234 ast_for_while_stmt(struct compiling *c, const node *n) | |
| 3235 { | |
| 3236 /* while_stmt: 'while' test ':' suite ['else' ':' suite] */ | |
| 3237 REQ(n, while_stmt); | |
| 3238 | |
| 3239 if (NCH(n) == 4) { | |
| 3240 expr_ty expression; | |
| 3241 asdl_seq *suite_seq; | |
| 3242 | |
| 3243 expression = ast_for_expr(c, CHILD(n, 1)); | |
| 3244 if (!expression) | |
| 3245 return NULL; | |
| 3246 suite_seq = ast_for_suite(c, CHILD(n, 3)); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3247 if (!suite_seq) |
| 35742 | 3248 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3249 return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3250 } |
| 3251 else if (NCH(n) == 7) { | |
| 3252 expr_ty expression; | |
| 3253 asdl_seq *seq1, *seq2; | |
| 3254 | |
| 3255 expression = ast_for_expr(c, CHILD(n, 1)); | |
| 3256 if (!expression) | |
| 3257 return NULL; | |
| 3258 seq1 = ast_for_suite(c, CHILD(n, 3)); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3259 if (!seq1) |
| 35742 | 3260 return NULL; |
| 3261 seq2 = 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
|
3262 if (!seq2) |
| 35742 | 3263 return NULL; |
| 3264 | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3265 return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3266 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3267 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3268 PyErr_Format(PyExc_SystemError, |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3269 "wrong number of tokens for 'while' statement: %d", |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3270 NCH(n)); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3271 return NULL; |
| 35742 | 3272 } |
| 3273 | |
| 3274 static stmt_ty | |
| 3275 ast_for_for_stmt(struct compiling *c, const node *n) | |
| 3276 { | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3277 asdl_seq *_target, *seq = NULL, *suite_seq; |
| 35742 | 3278 expr_ty expression; |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
3279 expr_ty target, first; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3280 const node *node_target; |
| 35742 | 3281 /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ |
| 3282 REQ(n, for_stmt); | |
| 3283 | |
| 3284 if (NCH(n) == 9) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3285 seq = ast_for_suite(c, CHILD(n, 8)); |
| 35742 | 3286 if (!seq) |
| 3287 return NULL; | |
| 3288 } | |
| 3289 | |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3290 node_target = CHILD(n, 1); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3291 _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
|
3292 if (!_target) |
| 35742 | 3293 return NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3294 /* Check the # of children rather than the length of _target, since |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3295 for x, in ... has 1 element in _target, but still requires a Tuple. */ |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
3296 first = (expr_ty)asdl_seq_GET(_target, 0); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3297 if (NCH(node_target) == 1) |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
3298 target = first; |
| 35742 | 3299 else |
|
55912
d4e3af343e32
Merged revisions 74464 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
54954
diff
changeset
|
3300 target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena); |
| 35742 | 3301 |
|
35798
857f68fba275
Write a separate ast_for_testlist_gexp() function instead of overloading
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35771
diff
changeset
|
3302 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
|
3303 if (!expression) |
| 35742 | 3304 return NULL; |
| 3305 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
|
3306 if (!suite_seq) |
| 35742 | 3307 return NULL; |
| 3308 | |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
3309 return For(target, expression, suite_seq, seq, LINENO(n), n->n_col_offset, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
3310 c->c_arena); |
| 35742 | 3311 } |
| 3312 | |
| 3313 static excepthandler_ty | |
| 3314 ast_for_except_clause(struct compiling *c, const node *exc, node *body) | |
| 3315 { | |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3316 /* except_clause: 'except' [test ['as' test]] */ |
| 35742 | 3317 REQ(exc, except_clause); |
| 3318 REQ(body, suite); | |
| 3319 | |
| 3320 if (NCH(exc) == 1) { | |
| 3321 asdl_seq *suite_seq = ast_for_suite(c, body); | |
| 3322 if (!suite_seq) | |
| 3323 return NULL; | |
| 3324 | |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46120
diff
changeset
|
3325 return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc), |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
3326 exc->n_col_offset, c->c_arena); |
| 35742 | 3327 } |
| 3328 else if (NCH(exc) == 2) { | |
| 3329 expr_ty expression; | |
| 3330 asdl_seq *suite_seq; | |
| 3331 | |
| 3332 expression = ast_for_expr(c, CHILD(exc, 1)); | |
| 3333 if (!expression) | |
| 3334 return NULL; | |
| 3335 suite_seq = ast_for_suite(c, body); | |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3336 if (!suite_seq) |
| 35742 | 3337 return NULL; |
| 3338 | |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46120
diff
changeset
|
3339 return ExceptHandler(expression, NULL, suite_seq, LINENO(exc), |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
3340 exc->n_col_offset, c->c_arena); |
| 35742 | 3341 } |
| 3342 else if (NCH(exc) == 4) { | |
| 3343 asdl_seq *suite_seq; | |
| 3344 expr_ty expression; | |
|
40588
4bab65fcca8e
Some more changes related to the new except syntax and semantics,
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
3345 identifier e = NEW_IDENTIFIER(CHILD(exc, 3)); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3346 if (!e) |
| 35742 | 3347 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3348 if (forbidden_name(c, e, CHILD(exc, 3), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
3349 return NULL; |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3350 expression = ast_for_expr(c, CHILD(exc, 1)); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3351 if (!expression) |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3352 return NULL; |
| 35742 | 3353 suite_seq = ast_for_suite(c, body); |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3354 if (!suite_seq) |
| 35742 | 3355 return NULL; |
| 3356 | |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46120
diff
changeset
|
3357 return ExceptHandler(expression, e, suite_seq, LINENO(exc), |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36877
diff
changeset
|
3358 exc->n_col_offset, c->c_arena); |
| 35742 | 3359 } |
|
36072
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3360 |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3361 PyErr_Format(PyExc_SystemError, |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3362 "wrong number of children for 'except' clause: %d", |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3363 NCH(exc)); |
|
de16a85c3b4c
Cleanup a bit and make things more consistent.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36066
diff
changeset
|
3364 return NULL; |
| 35742 | 3365 } |
| 3366 | |
| 3367 static stmt_ty | |
| 3368 ast_for_try_stmt(struct compiling *c, const node *n) | |
| 3369 { | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3370 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
|
3371 int n_except = (nch - 3)/3; |
|
70499
e0e663132363
unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents:
70438
diff
changeset
|
3372 asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL; |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3373 |
| 35742 | 3374 REQ(n, try_stmt); |
| 3375 | |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3376 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
|
3377 if (body == NULL) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3378 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3379 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3380 if (TYPE(CHILD(n, nch - 3)) == NAME) { |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3381 if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) { |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3382 if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) { |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3383 /* we can assume it's an "else", |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3384 because nch >= 9 for try-else-finally and |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3385 it would otherwise have a type of except_clause */ |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3386 orelse = ast_for_suite(c, CHILD(n, nch - 4)); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3387 if (orelse == NULL) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3388 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3389 n_except--; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3390 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3391 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3392 finally = ast_for_suite(c, CHILD(n, nch - 1)); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3393 if (finally == NULL) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3394 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3395 n_except--; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3396 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3397 else { |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3398 /* we can assume it's an "else", |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3399 otherwise it would have a type of except_clause */ |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3400 orelse = ast_for_suite(c, CHILD(n, nch - 1)); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3401 if (orelse == NULL) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3402 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3403 n_except--; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3404 } |
| 35742 | 3405 } |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3406 else if (TYPE(CHILD(n, nch - 3)) != except_clause) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3407 ast_error(c, n, "malformed 'try' statement"); |
| 35742 | 3408 return NULL; |
| 3409 } | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3410 |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3411 if (n_except > 0) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3412 int i; |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3413 /* process except statements to create a try ... except */ |
|
70499
e0e663132363
unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents:
70438
diff
changeset
|
3414 handlers = asdl_seq_new(n_except, c->c_arena); |
|
36066
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3415 if (handlers == NULL) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3416 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3417 |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3418 for (i = 0; i < n_except; i++) { |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3419 excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3), |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3420 CHILD(n, 5 + i * 3)); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3421 if (!e) |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3422 return NULL; |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3423 asdl_seq_SET(handlers, i, e); |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3424 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3425 } |
|
719ba02d2e2c
SF patch #1355913, PEP 341 - Unification of try/except and try/finally
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3426 |
|
70499
e0e663132363
unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents:
70438
diff
changeset
|
3427 assert(finally != NULL || asdl_seq_LEN(handlers)); |
|
e0e663132363
unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents:
70438
diff
changeset
|
3428 return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3429 } |
| 3430 | |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3431 /* with_item: test ['as' expr] */ |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3432 static withitem_ty |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3433 ast_for_with_item(struct compiling *c, const node *n) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3434 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3435 expr_ty context_expr, optional_vars = NULL; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3436 |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3437 REQ(n, with_item); |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3438 context_expr = ast_for_expr(c, CHILD(n, 0)); |
|
64183
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
3439 if (!context_expr) |
|
54c9c86ad104
Merged revisions 84209 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
62647
diff
changeset
|
3440 return NULL; |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3441 if (NCH(n) == 3) { |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3442 optional_vars = ast_for_expr(c, CHILD(n, 2)); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3443 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3444 if (!optional_vars) { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3445 return NULL; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3446 } |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3447 if (!set_context(c, optional_vars, Store, n)) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3448 return NULL; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3449 } |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3450 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3451 |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3452 return withitem(context_expr, optional_vars, c->c_arena); |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3453 } |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3454 |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3455 /* with_stmt: 'with' with_item (',' with_item)* ':' suite */ |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3456 static stmt_ty |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3457 ast_for_with_stmt(struct compiling *c, const node *n) |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3458 { |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3459 int i, n_items; |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3460 asdl_seq *items, *body; |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3461 |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3462 REQ(n, with_stmt); |
|
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3463 |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3464 n_items = (NCH(n) - 2) / 2; |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3465 items = asdl_seq_new(n_items, c->c_arena); |
|
78673
663de4dbb88a
Check return value of asdl_seq_new(). Found by Coverity.
Stefan Krah <skrah@bytereef.org>
parents:
75546
diff
changeset
|
3466 if (!items) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3467 return NULL; |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3468 for (i = 1; i < NCH(n) - 2; i += 2) { |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3469 withitem_ty item = ast_for_with_item(c, CHILD(n, i)); |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3470 if (!item) |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3471 return NULL; |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3472 asdl_seq_SET(items, (i - 1) / 2, item); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3473 } |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3474 |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3475 body = ast_for_suite(c, CHILD(n, NCH(n) - 1)); |
|
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3476 if (!body) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3477 return NULL; |
|
54338
287ce30d08b5
Merged revisions 72924 via svnmerge from
Georg Brandl <georg@python.org>
parents:
53707
diff
changeset
|
3478 |
|
70438
9b11cc4e2918
reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents:
69291
diff
changeset
|
3479 return With(items, body, LINENO(n), n->n_col_offset, c->c_arena); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3480 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3481 |
| 35742 | 3482 static stmt_ty |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3483 ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) |
| 35742 | 3484 { |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3485 /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */ |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3486 PyObject *classname; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3487 asdl_seq *s; |
|
49852
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3488 expr_ty call; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3489 |
| 35742 | 3490 REQ(n, classdef); |
| 3491 | |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3492 if (NCH(n) == 4) { /* class NAME ':' suite */ |
| 35742 | 3493 s = ast_for_suite(c, CHILD(n, 3)); |
| 3494 if (!s) | |
| 3495 return NULL; | |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3496 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3497 if (!classname) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3498 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3499 if (forbidden_name(c, classname, CHILD(n, 3), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
3500 return NULL; |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3501 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq, |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3502 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3503 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3504 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3505 if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3506 s = ast_for_suite(c, CHILD(n,5)); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3507 if (!s) |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3508 return NULL; |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3509 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3510 if (!classname) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3511 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3512 if (forbidden_name(c, classname, CHILD(n, 3), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
3513 return NULL; |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3514 return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq, |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3515 LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3516 } |
| 3517 | |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3518 /* class NAME '(' arglist ')' ':' suite */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3519 /* build up a fake Call node so we can extract its pieces */ |
|
49852
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3520 { |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3521 PyObject *dummy_name; |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3522 expr_ty dummy; |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3523 dummy_name = NEW_IDENTIFIER(CHILD(n, 1)); |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3524 if (!dummy_name) |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3525 return NULL; |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3526 dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena); |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3527 call = ast_for_call(c, CHILD(n, 3), dummy); |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3528 if (!call) |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3529 return NULL; |
|
30d01a5f517e
check the return value of NEW_IDENTIFIER in some more places
Benjamin Peterson <benjamin@python.org>
parents:
49847
diff
changeset
|
3530 } |
| 35742 | 3531 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
|
3532 if (!s) |
| 35742 | 3533 return NULL; |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3534 classname = NEW_IDENTIFIER(CHILD(n, 1)); |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3535 if (!classname) |
|
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3536 return NULL; |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3537 if (forbidden_name(c, classname, CHILD(n, 1), 0)) |
|
54954
c45e331238ae
In most cases, the parser will protect True, False, and None from being assign to.
Benjamin Peterson <benjamin@python.org>
parents:
54918
diff
changeset
|
3538 return NULL; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3539 |
|
49844
40b7277e665f
Merged revisions 67373 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49797
diff
changeset
|
3540 return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
3541 call->v.Call.starargs, call->v.Call.kwargs, s, |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3542 decorator_seq, LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3543 } |
| 3544 | |
| 3545 static stmt_ty | |
| 3546 ast_for_stmt(struct compiling *c, const node *n) | |
| 3547 { | |
| 3548 if (TYPE(n) == stmt) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3549 assert(NCH(n) == 1); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3550 n = CHILD(n, 0); |
| 35742 | 3551 } |
| 3552 if (TYPE(n) == simple_stmt) { | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3553 assert(num_stmts(n) == 1); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3554 n = CHILD(n, 0); |
| 35742 | 3555 } |
| 3556 if (TYPE(n) == small_stmt) { | |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
3557 n = CHILD(n, 0); |
|
40965
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3558 /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3559 | import_stmt | global_stmt | nonlocal_stmt | assert_stmt |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3560 */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3561 switch (TYPE(n)) { |
| 35742 | 3562 case expr_stmt: |
| 3563 return ast_for_expr_stmt(c, n); | |
| 3564 case del_stmt: | |
| 3565 return ast_for_del_stmt(c, n); | |
| 3566 case pass_stmt: | |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36780
diff
changeset
|
3567 return Pass(LINENO(n), n->n_col_offset, c->c_arena); |
| 35742 | 3568 case flow_stmt: |
| 3569 return ast_for_flow_stmt(c, n); | |
| 3570 case import_stmt: | |
| 3571 return ast_for_import_stmt(c, n); | |
| 3572 case global_stmt: | |
| 3573 return ast_for_global_stmt(c, n); | |
|
40965
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3574 case nonlocal_stmt: |
|
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40941
diff
changeset
|
3575 return ast_for_nonlocal_stmt(c, n); |
| 35742 | 3576 case assert_stmt: |
| 3577 return ast_for_assert_stmt(c, n); | |
| 3578 default: | |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
3579 PyErr_Format(PyExc_SystemError, |
| 35742 | 3580 "unhandled small_stmt: TYPE=%d NCH=%d\n", |
| 3581 TYPE(n), NCH(n)); | |
| 3582 return NULL; | |
| 3583 } | |
| 3584 } | |
| 3585 else { | |
| 3586 /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3587 | funcdef | classdef | decorated |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3588 */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3589 node *ch = CHILD(n, 0); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3590 REQ(n, compound_stmt); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3591 switch (TYPE(ch)) { |
| 35742 | 3592 case if_stmt: |
| 3593 return ast_for_if_stmt(c, ch); | |
| 3594 case while_stmt: | |
| 3595 return ast_for_while_stmt(c, ch); | |
| 3596 case for_stmt: | |
| 3597 return ast_for_for_stmt(c, ch); | |
| 3598 case try_stmt: | |
| 3599 return ast_for_try_stmt(c, ch); | |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3600 case with_stmt: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36686
diff
changeset
|
3601 return ast_for_with_stmt(c, ch); |
| 35742 | 3602 case funcdef: |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3603 return ast_for_funcdef(c, ch, NULL); |
| 35742 | 3604 case classdef: |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
3605 return ast_for_classdef(c, ch, NULL); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3606 case decorated: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3607 return ast_for_decorated(c, ch); |
| 35742 | 3608 default: |
|
35870
f531c05cd240
Convert all internal errors from Exception to SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
35868
diff
changeset
|
3609 PyErr_Format(PyExc_SystemError, |
| 35742 | 3610 "unhandled small_stmt: TYPE=%d NCH=%d\n", |
| 3611 TYPE(n), NCH(n)); | |
| 3612 return NULL; | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3613 } |
| 35742 | 3614 } |
| 3615 } | |
| 3616 | |
| 3617 static PyObject * | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3618 parsenumber(struct compiling *c, const char *s) |
| 35742 | 3619 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3620 const char *end; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3621 long x; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3622 double dx; |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3623 Py_complex compl; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3624 int imflag; |
| 35742 | 3625 |
|
50035
4c9844cf2a3f
Merged revisions 67595 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49852
diff
changeset
|
3626 assert(s != NULL); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3627 errno = 0; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3628 end = s + strlen(s) - 1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3629 imflag = *end == 'j' || *end == 'J'; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3630 if (s[0] == '0') { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3631 x = (long) PyOS_strtoul((char *)s, (char **)&end, 0); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3632 if (x < 0 && errno == 0) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3633 return PyLong_FromString((char *)s, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3634 (char **)0, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3635 0); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3636 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3637 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3638 else |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3639 x = PyOS_strtol((char *)s, (char **)&end, 0); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3640 if (*end == '\0') { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3641 if (errno != 0) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3642 return PyLong_FromString((char *)s, (char **)0, 0); |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
44025
diff
changeset
|
3643 return PyLong_FromLong(x); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3644 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3645 /* XXX Huge floats may silently fail */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3646 if (imflag) { |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3647 compl.real = 0.; |
|
53707
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3648 compl.imag = PyOS_string_to_double(s, (char **)&end, NULL); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3649 if (compl.imag == -1.0 && PyErr_Occurred()) |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3650 return NULL; |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3651 return PyComplex_FromCComplex(compl); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3652 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3653 else |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3654 { |
|
53707
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3655 dx = PyOS_string_to_double(s, NULL, NULL); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3656 if (dx == -1.0 && PyErr_Occurred()) |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3657 return NULL; |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
50886
diff
changeset
|
3658 return PyFloat_FromDouble(dx); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3659 } |
| 35742 | 3660 } |
| 3661 | |
| 3662 static PyObject * | |
| 72475 | 3663 decode_utf8(struct compiling *c, const char **sPtr, const char *end) |
| 35742 | 3664 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3665 char *s, *t; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3666 t = s = (char *)*sPtr; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3667 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3668 while (s < end && (*s & 0x80)) s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3669 *sPtr = s; |
| 72475 | 3670 return PyUnicode_DecodeUTF8(t, s - t, NULL); |
| 35742 | 3671 } |
| 3672 | |
| 3673 static PyObject * | |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3674 decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding) |
| 35742 | 3675 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3676 PyObject *v, *u; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3677 char *buf; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3678 char *p; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3679 const char *end; |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3680 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3681 if (encoding == NULL) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3682 u = NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3683 } else { |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47301
diff
changeset
|
3684 /* check for integer overflow */ |
|
56955
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3685 if (len > PY_SIZE_MAX / 6) |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47301
diff
changeset
|
3686 return NULL; |
|
56955
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3687 /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5 |
|
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3688 "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */ |
|
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3689 u = PyBytes_FromStringAndSize((char *)NULL, len * 6); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3690 if (u == NULL) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3691 return NULL; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
3692 p = buf = PyBytes_AsString(u); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3693 end = s + len; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3694 while (s < end) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3695 if (*s == '\\') { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3696 *p++ = *s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3697 if (*s & 0x80) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3698 strcpy(p, "u005c"); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3699 p += 5; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3700 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3701 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3702 if (*s & 0x80) { /* XXX inefficient */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3703 PyObject *w; |
| 72475 | 3704 int kind; |
| 3705 void *data; | |
| 3706 Py_ssize_t len, i; | |
| 3707 w = decode_utf8(c, &s, end); | |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3708 if (w == NULL) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3709 Py_DECREF(u); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3710 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3711 } |
| 72475 | 3712 kind = PyUnicode_KIND(w); |
| 3713 data = PyUnicode_DATA(w); | |
| 3714 len = PyUnicode_GET_LENGTH(w); | |
| 3715 for (i = 0; i < len; i++) { | |
| 3716 Py_UCS4 chr = PyUnicode_READ(kind, data, i); | |
| 3717 sprintf(p, "\\U%08x", chr); | |
|
56955
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3718 p += 10; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3719 } |
|
56955
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3720 /* Should be impossible to overflow */ |
|
f32dc84a876c
Merged revisions 75928 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
56363
diff
changeset
|
3721 assert(p - buf <= Py_SIZE(u)); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3722 Py_DECREF(w); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3723 } else { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3724 *p++ = *s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3725 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3726 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3727 len = p - buf; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3728 s = buf; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3729 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3730 if (rawmode) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3731 v = PyUnicode_DecodeRawUnicodeEscape(s, len, NULL); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3732 else |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3733 v = PyUnicode_DecodeUnicodeEscape(s, len, NULL); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3734 Py_XDECREF(u); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3735 return v; |
| 35742 | 3736 } |
| 3737 | |
| 3738 /* s is a Python string literal, including the bracketing quote characters, | |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3739 * and r &/or b prefixes (if any), and embedded escape sequences (if any). |
| 35742 | 3740 * parsestr parses it, and returns the decoded Python string object. |
| 3741 */ | |
| 3742 static PyObject * | |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3743 parsestr(struct compiling *c, const node *n, int *bytesmode) |
| 35742 | 3744 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3745 size_t len; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3746 const char *s = STR(n); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3747 int quote = Py_CHARMASK(*s); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3748 int rawmode = 0; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3749 int need_encoding; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43734
diff
changeset
|
3750 if (isalpha(quote)) { |
|
74354
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3751 while (!*bytesmode || !rawmode) { |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3752 if (quote == 'b' || quote == 'B') { |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3753 quote = *++s; |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3754 *bytesmode = 1; |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3755 } |
|
75381
ed9497d6a216
Basic support for PEP 414 without docs or tests.
Armin Ronacher <armin.ronacher@active-4.com>
parents:
74462
diff
changeset
|
3756 else if (quote == 'u' || quote == 'U') { |
|
ed9497d6a216
Basic support for PEP 414 without docs or tests.
Armin Ronacher <armin.ronacher@active-4.com>
parents:
74462
diff
changeset
|
3757 quote = *++s; |
|
ed9497d6a216
Basic support for PEP 414 without docs or tests.
Armin Ronacher <armin.ronacher@active-4.com>
parents:
74462
diff
changeset
|
3758 } |
|
74354
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3759 else if (quote == 'r' || quote == 'R') { |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3760 quote = *++s; |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3761 rawmode = 1; |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3762 } |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3763 else { |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3764 break; |
|
bbed36370b08
Issue #13748: Raw bytes literals can now be written with the `rb` prefix as well as `br`.
Antoine Pitrou <solipsis@pitrou.net>
parents:
72925
diff
changeset
|
3765 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3766 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3767 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3768 if (quote != '\'' && quote != '\"') { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3769 PyErr_BadInternalCall(); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3770 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3771 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3772 s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3773 len = strlen(s); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3774 if (len > INT_MAX) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3775 PyErr_SetString(PyExc_OverflowError, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3776 "string to parse is too long"); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3777 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3778 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3779 if (s[--len] != quote) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3780 PyErr_BadInternalCall(); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3781 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3782 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3783 if (len >= 4 && s[0] == quote && s[1] == quote) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3784 s += 2; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3785 len -= 2; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3786 if (s[--len] != quote || s[--len] != quote) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3787 PyErr_BadInternalCall(); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3788 return NULL; |
| 40894 | 3789 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3790 } |
|
46306
b10292eafb07
Reverted r62128 on Guido's orders
Benjamin Peterson <benjamin@python.org>
parents:
46272
diff
changeset
|
3791 if (!*bytesmode && !rawmode) { |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46306
diff
changeset
|
3792 return decode_unicode(c, s, len, rawmode, c->c_encoding); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3793 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3794 if (*bytesmode) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3795 /* Disallow non-ascii characters (but not escapes) */ |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3796 const char *ch; |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3797 for (ch = s; *ch; ch++) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3798 if (Py_CHARMASK(*ch) >= 0x80) { |
|
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3799 ast_error(c, n, "bytes can only contain ASCII " |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3800 "literal characters."); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3801 return NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3802 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3803 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3804 } |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3805 need_encoding = (!*bytesmode && c->c_encoding != NULL && |
|
49539
481ad3d9ffd1
Latin-1 source code was not being properly decoded when passed through
Brett Cannon <bcannon@gmail.com>
parents:
48777
diff
changeset
|
3806 strcmp(c->c_encoding, "utf-8") != 0); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3807 if (rawmode || strchr(s, '\\') == NULL) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3808 if (need_encoding) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3809 PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL); |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3810 if (u == NULL || !*bytesmode) |
|
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3811 return u; |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3812 v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3813 Py_DECREF(u); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3814 return v; |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3815 } else if (*bytesmode) { |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
3816 return PyBytes_FromStringAndSize(s, len); |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3817 } else if (strcmp(c->c_encoding, "utf-8") == 0) { |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3818 return PyUnicode_FromStringAndSize(s, len); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56955
diff
changeset
|
3819 } else { |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3820 return PyUnicode_DecodeLatin1(s, len, NULL); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3821 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3822 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
3823 return PyBytes_DecodeEscape(s, len, NULL, 1, |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3824 need_encoding ? c->c_encoding : NULL); |
| 35742 | 3825 } |
| 3826 | |
|
43819
068655054b0d
Minimal change that disables (AFAICT) the interpolation of \u and \U inside
Guido van Rossum <guido@python.org>
parents:
43777
diff
changeset
|
3827 /* Build a Python string object out of a STRING+ atom. This takes care of |
| 35742 | 3828 * compile-time literal catenation, calling parsestr() on each piece, and |
| 3829 * pasting the intermediate results together. | |
| 3830 */ | |
| 3831 static PyObject * | |
| 40894 | 3832 parsestrplus(struct compiling *c, const node *n, int *bytesmode) |
| 35742 | 3833 { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3834 PyObject *v; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3835 int i; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3836 REQ(CHILD(n, 0), STRING); |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3837 v = parsestr(c, CHILD(n, 0), bytesmode); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3838 if (v != NULL) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3839 /* String literal concatenation */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3840 for (i = 1; i < NCH(n); i++) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3841 PyObject *s; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3842 int subbm = 0; |
|
46120
78504d604b44
Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45931
diff
changeset
|
3843 s = parsestr(c, CHILD(n, i), &subbm); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3844 if (s == NULL) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3845 goto onError; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3846 if (*bytesmode != subbm) { |
|
78840
58de275e9224
get rid of ast_error_finish by passing the compiling struct to ast_error
Benjamin Peterson <benjamin@python.org>
parents:
78839
diff
changeset
|
3847 ast_error(c, n, "cannot mix bytes and nonbytes literals"); |
|
78962
4a343636c8ca
Fixed memory leak in error branch of parsestrplus. CID 715374 Variable s going out of scope leaks the storage it points to.
Christian Heimes <christian@cheimes.de>
parents:
78841
diff
changeset
|
3848 Py_DECREF(s); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3849 goto onError; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3850 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
3851 if (PyBytes_Check(v) && PyBytes_Check(s)) { |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
46664
diff
changeset
|
3852 PyBytes_ConcatAndDel(&v, s); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3853 if (v == NULL) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3854 goto onError; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3855 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3856 else { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3857 PyObject *temp = PyUnicode_Concat(v, s); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3858 Py_DECREF(s); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3859 Py_DECREF(v); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3860 v = temp; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3861 if (v == NULL) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3862 goto onError; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3863 } |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3864 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3865 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3866 return v; |
| 35742 | 3867 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3868 onError: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3869 Py_XDECREF(v); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41509
diff
changeset
|
3870 return NULL; |
| 35742 | 3871 } |
