blob: e34bd26d74a19408d57a71f57cdaf3565e13e7aa [file] [log] [blame]
Victor Stinner5cf47822020-11-02 22:03:28 +01001// File automatically generated by Parser/asdl_c.py.
2
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003#include "Python.h"
Victor Stinnerd36d6a92021-04-07 13:01:09 +02004#include "pycore_ast.h"
Victor Stinnere0bf70d2021-03-18 02:46:06 +01005#include "pycore_ast_state.h" // struct ast_state
6#include "pycore_interp.h" // _PyInterpreterState.ast
7#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008#include "structmember.h"
9#include <stddef.h>
Dino Viehlandac46eb42019-09-11 10:16:34 -070010
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020011// Forward declaration
Victor Stinner5cf47822020-11-02 22:03:28 +010012static int init_types(struct ast_state *state);
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020013
Victor Stinner5cf47822020-11-02 22:03:28 +010014static struct ast_state*
15get_ast_state(void)
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020016{
Victor Stinner5cf47822020-11-02 22:03:28 +010017 PyInterpreterState *interp = _PyInterpreterState_GET();
18 struct ast_state *state = &interp->ast;
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020019 if (!init_types(state)) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020020 return NULL;
21 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020022 return state;
Victor Stinner74419f02020-07-03 11:35:37 +020023}
Victor Stinner5cf47822020-11-02 22:03:28 +010024
Victor Stinnerfd957c12020-11-03 18:07:15 +010025void _PyAST_Fini(PyInterpreterState *interp)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020026{
Victor Stinnerfd957c12020-11-03 18:07:15 +010027 struct ast_state *state = &interp->ast;
Victor Stinner5cf47822020-11-02 22:03:28 +010028
Victor Stinner74419f02020-07-03 11:35:37 +020029 Py_CLEAR(state->AST_type);
30 Py_CLEAR(state->Add_singleton);
31 Py_CLEAR(state->Add_type);
32 Py_CLEAR(state->And_singleton);
33 Py_CLEAR(state->And_type);
34 Py_CLEAR(state->AnnAssign_type);
35 Py_CLEAR(state->Assert_type);
36 Py_CLEAR(state->Assign_type);
37 Py_CLEAR(state->AsyncFor_type);
38 Py_CLEAR(state->AsyncFunctionDef_type);
39 Py_CLEAR(state->AsyncWith_type);
40 Py_CLEAR(state->Attribute_type);
41 Py_CLEAR(state->AugAssign_type);
42 Py_CLEAR(state->Await_type);
43 Py_CLEAR(state->BinOp_type);
44 Py_CLEAR(state->BitAnd_singleton);
45 Py_CLEAR(state->BitAnd_type);
46 Py_CLEAR(state->BitOr_singleton);
47 Py_CLEAR(state->BitOr_type);
48 Py_CLEAR(state->BitXor_singleton);
49 Py_CLEAR(state->BitXor_type);
50 Py_CLEAR(state->BoolOp_type);
51 Py_CLEAR(state->Break_type);
52 Py_CLEAR(state->Call_type);
53 Py_CLEAR(state->ClassDef_type);
54 Py_CLEAR(state->Compare_type);
55 Py_CLEAR(state->Constant_type);
56 Py_CLEAR(state->Continue_type);
57 Py_CLEAR(state->Del_singleton);
58 Py_CLEAR(state->Del_type);
59 Py_CLEAR(state->Delete_type);
60 Py_CLEAR(state->DictComp_type);
61 Py_CLEAR(state->Dict_type);
62 Py_CLEAR(state->Div_singleton);
63 Py_CLEAR(state->Div_type);
64 Py_CLEAR(state->Eq_singleton);
65 Py_CLEAR(state->Eq_type);
66 Py_CLEAR(state->ExceptHandler_type);
67 Py_CLEAR(state->Expr_type);
68 Py_CLEAR(state->Expression_type);
69 Py_CLEAR(state->FloorDiv_singleton);
70 Py_CLEAR(state->FloorDiv_type);
71 Py_CLEAR(state->For_type);
72 Py_CLEAR(state->FormattedValue_type);
73 Py_CLEAR(state->FunctionDef_type);
74 Py_CLEAR(state->FunctionType_type);
75 Py_CLEAR(state->GeneratorExp_type);
76 Py_CLEAR(state->Global_type);
77 Py_CLEAR(state->GtE_singleton);
78 Py_CLEAR(state->GtE_type);
79 Py_CLEAR(state->Gt_singleton);
80 Py_CLEAR(state->Gt_type);
81 Py_CLEAR(state->IfExp_type);
82 Py_CLEAR(state->If_type);
83 Py_CLEAR(state->ImportFrom_type);
84 Py_CLEAR(state->Import_type);
85 Py_CLEAR(state->In_singleton);
86 Py_CLEAR(state->In_type);
87 Py_CLEAR(state->Interactive_type);
88 Py_CLEAR(state->Invert_singleton);
89 Py_CLEAR(state->Invert_type);
90 Py_CLEAR(state->IsNot_singleton);
91 Py_CLEAR(state->IsNot_type);
92 Py_CLEAR(state->Is_singleton);
93 Py_CLEAR(state->Is_type);
94 Py_CLEAR(state->JoinedStr_type);
95 Py_CLEAR(state->LShift_singleton);
96 Py_CLEAR(state->LShift_type);
97 Py_CLEAR(state->Lambda_type);
98 Py_CLEAR(state->ListComp_type);
99 Py_CLEAR(state->List_type);
100 Py_CLEAR(state->Load_singleton);
101 Py_CLEAR(state->Load_type);
102 Py_CLEAR(state->LtE_singleton);
103 Py_CLEAR(state->LtE_type);
104 Py_CLEAR(state->Lt_singleton);
105 Py_CLEAR(state->Lt_type);
106 Py_CLEAR(state->MatMult_singleton);
107 Py_CLEAR(state->MatMult_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800108 Py_CLEAR(state->MatchAs_type);
109 Py_CLEAR(state->MatchOr_type);
110 Py_CLEAR(state->Match_type);
Victor Stinner74419f02020-07-03 11:35:37 +0200111 Py_CLEAR(state->Mod_singleton);
112 Py_CLEAR(state->Mod_type);
113 Py_CLEAR(state->Module_type);
114 Py_CLEAR(state->Mult_singleton);
115 Py_CLEAR(state->Mult_type);
116 Py_CLEAR(state->Name_type);
117 Py_CLEAR(state->NamedExpr_type);
118 Py_CLEAR(state->Nonlocal_type);
119 Py_CLEAR(state->NotEq_singleton);
120 Py_CLEAR(state->NotEq_type);
121 Py_CLEAR(state->NotIn_singleton);
122 Py_CLEAR(state->NotIn_type);
123 Py_CLEAR(state->Not_singleton);
124 Py_CLEAR(state->Not_type);
125 Py_CLEAR(state->Or_singleton);
126 Py_CLEAR(state->Or_type);
127 Py_CLEAR(state->Pass_type);
128 Py_CLEAR(state->Pow_singleton);
129 Py_CLEAR(state->Pow_type);
130 Py_CLEAR(state->RShift_singleton);
131 Py_CLEAR(state->RShift_type);
132 Py_CLEAR(state->Raise_type);
133 Py_CLEAR(state->Return_type);
134 Py_CLEAR(state->SetComp_type);
135 Py_CLEAR(state->Set_type);
136 Py_CLEAR(state->Slice_type);
137 Py_CLEAR(state->Starred_type);
138 Py_CLEAR(state->Store_singleton);
139 Py_CLEAR(state->Store_type);
140 Py_CLEAR(state->Sub_singleton);
141 Py_CLEAR(state->Sub_type);
142 Py_CLEAR(state->Subscript_type);
143 Py_CLEAR(state->Try_type);
144 Py_CLEAR(state->Tuple_type);
145 Py_CLEAR(state->TypeIgnore_type);
146 Py_CLEAR(state->UAdd_singleton);
147 Py_CLEAR(state->UAdd_type);
148 Py_CLEAR(state->USub_singleton);
149 Py_CLEAR(state->USub_type);
150 Py_CLEAR(state->UnaryOp_type);
151 Py_CLEAR(state->While_type);
152 Py_CLEAR(state->With_type);
153 Py_CLEAR(state->YieldFrom_type);
154 Py_CLEAR(state->Yield_type);
155 Py_CLEAR(state->__dict__);
156 Py_CLEAR(state->__doc__);
Brandt Bucher145bf262021-02-26 14:51:55 -0800157 Py_CLEAR(state->__match_args__);
Victor Stinner74419f02020-07-03 11:35:37 +0200158 Py_CLEAR(state->__module__);
159 Py_CLEAR(state->_attributes);
160 Py_CLEAR(state->_fields);
161 Py_CLEAR(state->alias_type);
162 Py_CLEAR(state->annotation);
163 Py_CLEAR(state->arg);
164 Py_CLEAR(state->arg_type);
165 Py_CLEAR(state->args);
166 Py_CLEAR(state->argtypes);
167 Py_CLEAR(state->arguments_type);
168 Py_CLEAR(state->asname);
169 Py_CLEAR(state->ast);
170 Py_CLEAR(state->attr);
171 Py_CLEAR(state->bases);
172 Py_CLEAR(state->body);
173 Py_CLEAR(state->boolop_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800174 Py_CLEAR(state->cases);
Victor Stinner74419f02020-07-03 11:35:37 +0200175 Py_CLEAR(state->cause);
176 Py_CLEAR(state->cmpop_type);
177 Py_CLEAR(state->col_offset);
178 Py_CLEAR(state->comparators);
179 Py_CLEAR(state->comprehension_type);
180 Py_CLEAR(state->context_expr);
181 Py_CLEAR(state->conversion);
182 Py_CLEAR(state->ctx);
183 Py_CLEAR(state->decorator_list);
184 Py_CLEAR(state->defaults);
185 Py_CLEAR(state->elt);
186 Py_CLEAR(state->elts);
187 Py_CLEAR(state->end_col_offset);
188 Py_CLEAR(state->end_lineno);
189 Py_CLEAR(state->exc);
190 Py_CLEAR(state->excepthandler_type);
191 Py_CLEAR(state->expr_context_type);
192 Py_CLEAR(state->expr_type);
193 Py_CLEAR(state->finalbody);
194 Py_CLEAR(state->format_spec);
195 Py_CLEAR(state->func);
196 Py_CLEAR(state->generators);
Brandt Bucher145bf262021-02-26 14:51:55 -0800197 Py_CLEAR(state->guard);
Victor Stinner74419f02020-07-03 11:35:37 +0200198 Py_CLEAR(state->handlers);
199 Py_CLEAR(state->id);
200 Py_CLEAR(state->ifs);
201 Py_CLEAR(state->is_async);
202 Py_CLEAR(state->items);
203 Py_CLEAR(state->iter);
204 Py_CLEAR(state->key);
205 Py_CLEAR(state->keys);
206 Py_CLEAR(state->keyword_type);
207 Py_CLEAR(state->keywords);
208 Py_CLEAR(state->kind);
209 Py_CLEAR(state->kw_defaults);
210 Py_CLEAR(state->kwarg);
211 Py_CLEAR(state->kwonlyargs);
212 Py_CLEAR(state->left);
213 Py_CLEAR(state->level);
214 Py_CLEAR(state->lineno);
215 Py_CLEAR(state->lower);
Brandt Bucher145bf262021-02-26 14:51:55 -0800216 Py_CLEAR(state->match_case_type);
Victor Stinner74419f02020-07-03 11:35:37 +0200217 Py_CLEAR(state->mod_type);
218 Py_CLEAR(state->module);
219 Py_CLEAR(state->msg);
220 Py_CLEAR(state->name);
221 Py_CLEAR(state->names);
222 Py_CLEAR(state->op);
223 Py_CLEAR(state->operand);
224 Py_CLEAR(state->operator_type);
225 Py_CLEAR(state->ops);
226 Py_CLEAR(state->optional_vars);
227 Py_CLEAR(state->orelse);
Brandt Bucher145bf262021-02-26 14:51:55 -0800228 Py_CLEAR(state->pattern);
229 Py_CLEAR(state->patterns);
Victor Stinner74419f02020-07-03 11:35:37 +0200230 Py_CLEAR(state->posonlyargs);
231 Py_CLEAR(state->returns);
232 Py_CLEAR(state->right);
233 Py_CLEAR(state->simple);
234 Py_CLEAR(state->slice);
235 Py_CLEAR(state->step);
236 Py_CLEAR(state->stmt_type);
Brandt Bucher145bf262021-02-26 14:51:55 -0800237 Py_CLEAR(state->subject);
Victor Stinner74419f02020-07-03 11:35:37 +0200238 Py_CLEAR(state->tag);
239 Py_CLEAR(state->target);
240 Py_CLEAR(state->targets);
241 Py_CLEAR(state->test);
242 Py_CLEAR(state->type);
243 Py_CLEAR(state->type_comment);
244 Py_CLEAR(state->type_ignore_type);
245 Py_CLEAR(state->type_ignores);
246 Py_CLEAR(state->unaryop_type);
247 Py_CLEAR(state->upper);
248 Py_CLEAR(state->value);
249 Py_CLEAR(state->values);
250 Py_CLEAR(state->vararg);
251 Py_CLEAR(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700252
Victor Stinnere0bf70d2021-03-18 02:46:06 +0100253#if !defined(NDEBUG)
Victor Stinnerfd957c12020-11-03 18:07:15 +0100254 state->initialized = -1;
255#else
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200256 state->initialized = 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +0100257#endif
Dino Viehlandac46eb42019-09-11 10:16:34 -0700258}
259
Victor Stinner5cf47822020-11-02 22:03:28 +0100260static int init_identifiers(struct ast_state *state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700261{
Dino Viehlandac46eb42019-09-11 10:16:34 -0700262 if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300263 if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800264 if ((state->__match_args__ = PyUnicode_InternFromString("__match_args__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700265 if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700266 if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0;
267 if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0;
268 if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0;
269 if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0;
270 if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0;
271 if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0;
272 if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200273 if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700274 if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
275 if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
276 if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800277 if ((state->cases = PyUnicode_InternFromString("cases")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700278 if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
279 if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0;
280 if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0;
281 if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0;
282 if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0;
283 if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0;
284 if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0;
285 if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700286 if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0;
287 if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0;
288 if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0;
289 if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0;
290 if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0;
291 if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0;
292 if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0;
293 if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0;
294 if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800295 if ((state->guard = PyUnicode_InternFromString("guard")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700296 if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0;
297 if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0;
298 if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0;
299 if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0;
300 if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0;
301 if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0;
302 if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0;
303 if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0;
304 if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0;
305 if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0;
306 if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0;
307 if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0;
308 if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0;
309 if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0;
310 if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0;
311 if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0;
312 if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0;
313 if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0;
314 if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0;
315 if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0;
316 if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0;
317 if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0;
318 if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0;
319 if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0;
320 if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0;
321 if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800322 if ((state->pattern = PyUnicode_InternFromString("pattern")) == NULL) return 0;
323 if ((state->patterns = PyUnicode_InternFromString("patterns")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700324 if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0;
325 if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0;
326 if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0;
327 if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0;
328 if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0;
329 if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -0800330 if ((state->subject = PyUnicode_InternFromString("subject")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700331 if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0;
332 if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0;
333 if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0;
334 if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0;
335 if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
336 if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
337 if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
338 if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
339 if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
340 if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
341 if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0;
342 return 1;
343};
344
Pablo Galindoa5634c42020-09-16 19:42:00 +0100345GENERATE_ASDL_SEQ_CONSTRUCTOR(mod, mod_ty)
346GENERATE_ASDL_SEQ_CONSTRUCTOR(stmt, stmt_ty)
347GENERATE_ASDL_SEQ_CONSTRUCTOR(expr, expr_ty)
348GENERATE_ASDL_SEQ_CONSTRUCTOR(comprehension, comprehension_ty)
349GENERATE_ASDL_SEQ_CONSTRUCTOR(excepthandler, excepthandler_ty)
350GENERATE_ASDL_SEQ_CONSTRUCTOR(arguments, arguments_ty)
351GENERATE_ASDL_SEQ_CONSTRUCTOR(arg, arg_ty)
352GENERATE_ASDL_SEQ_CONSTRUCTOR(keyword, keyword_ty)
353GENERATE_ASDL_SEQ_CONSTRUCTOR(alias, alias_ty)
354GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty)
Brandt Bucher145bf262021-02-26 14:51:55 -0800355GENERATE_ASDL_SEQ_CONSTRUCTOR(match_case, match_case_ty)
Pablo Galindoa5634c42020-09-16 19:42:00 +0100356GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty)
357
Victor Stinner5cf47822020-11-02 22:03:28 +0100358static PyObject* ast2obj_mod(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300359static const char * const Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200360 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800361 "type_ignores",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000362};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300363static const char * const Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200364 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000365};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300366static const char * const Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200367 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000368};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300369static const char * const FunctionType_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800370 "argtypes",
371 "returns",
372};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300373static const char * const stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200374 "lineno",
375 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000376 "end_lineno",
377 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000378};
Victor Stinner5cf47822020-11-02 22:03:28 +0100379static PyObject* ast2obj_stmt(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300380static const char * const FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200381 "name",
382 "args",
383 "body",
384 "decorator_list",
385 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800386 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000387};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300388static const char * const AsyncFunctionDef_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400389 "name",
390 "args",
391 "body",
392 "decorator_list",
393 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800394 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400395};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300396static const char * const ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200397 "name",
398 "bases",
399 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200400 "body",
401 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000402};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300403static const char * const Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200404 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000405};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300406static const char * const Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200407 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000408};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300409static const char * const Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200410 "targets",
411 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800412 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000413};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300414static const char * const AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200415 "target",
416 "op",
417 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000418};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300419static const char * const AnnAssign_fields[]={
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700420 "target",
421 "annotation",
422 "value",
423 "simple",
424};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300425static const char * const For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200426 "target",
427 "iter",
428 "body",
429 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800430 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000431};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300432static const char * const AsyncFor_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400433 "target",
434 "iter",
435 "body",
436 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800437 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400438};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300439static const char * const While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200440 "test",
441 "body",
442 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000443};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300444static const char * const If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200445 "test",
446 "body",
447 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000448};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300449static const char * const With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200450 "items",
451 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800452 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000453};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300454static const char * const AsyncWith_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400455 "items",
456 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800457 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400458};
Brandt Bucher145bf262021-02-26 14:51:55 -0800459static const char * const Match_fields[]={
460 "subject",
461 "cases",
462};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300463static const char * const Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200464 "exc",
465 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000466};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300467static const char * const Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200468 "body",
469 "handlers",
470 "orelse",
471 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000472};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300473static const char * const Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200474 "test",
475 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000476};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300477static const char * const Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200478 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000479};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300480static const char * const ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200481 "module",
482 "names",
483 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000484};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300485static const char * const Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200486 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000487};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300488static const char * const Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200489 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000490};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300491static const char * const Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200492 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000493};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300494static const char * const expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200495 "lineno",
496 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000497 "end_lineno",
498 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000499};
Victor Stinner5cf47822020-11-02 22:03:28 +0100500static PyObject* ast2obj_expr(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300501static const char * const BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200502 "op",
503 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000504};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300505static const char * const NamedExpr_fields[]={
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700506 "target",
507 "value",
508};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300509static const char * const BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200510 "left",
511 "op",
512 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000513};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300514static const char * const UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200515 "op",
516 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000517};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300518static const char * const Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200519 "args",
520 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000521};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300522static const char * const IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200523 "test",
524 "body",
525 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000526};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300527static const char * const Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200528 "keys",
529 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000530};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300531static const char * const Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200532 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000533};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300534static const char * const ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200535 "elt",
536 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000537};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300538static const char * const SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200539 "elt",
540 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000541};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300542static const char * const DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200543 "key",
544 "value",
545 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000546};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300547static const char * const GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200548 "elt",
549 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000550};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300551static const char * const Await_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400552 "value",
553};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300554static const char * const Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200555 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500556};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300557static const char * const YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200558 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000559};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300560static const char * const Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200561 "left",
562 "ops",
563 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000564};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300565static const char * const Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200566 "func",
567 "args",
568 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000569};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300570static const char * const FormattedValue_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400571 "value",
572 "conversion",
573 "format_spec",
574};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300575static const char * const JoinedStr_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400576 "values",
577};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300578static const char * const Constant_fields[]={
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100579 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700580 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100581};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300582static const char * const Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200583 "value",
584 "attr",
585 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000586};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300587static const char * const Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200588 "value",
589 "slice",
590 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000591};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300592static const char * const Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200593 "value",
594 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000595};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300596static const char * const Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200597 "id",
598 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000599};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300600static const char * const List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200601 "elts",
602 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000603};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300604static const char * const Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200605 "elts",
606 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000607};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300608static const char * const Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200609 "lower",
610 "upper",
611 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000612};
Brandt Bucher145bf262021-02-26 14:51:55 -0800613static const char * const MatchAs_fields[]={
614 "pattern",
615 "name",
616};
617static const char * const MatchOr_fields[]={
618 "patterns",
619};
Victor Stinner5cf47822020-11-02 22:03:28 +0100620static PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty);
621static PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty);
622static PyObject* ast2obj_operator(struct ast_state *state, operator_ty);
623static PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty);
624static PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty);
625static PyObject* ast2obj_comprehension(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300626static const char * const comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200627 "target",
628 "iter",
629 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700630 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000631};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300632static const char * const excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200633 "lineno",
634 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000635 "end_lineno",
636 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000637};
Victor Stinner5cf47822020-11-02 22:03:28 +0100638static PyObject* ast2obj_excepthandler(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300639static const char * const ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200640 "type",
641 "name",
642 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000643};
Victor Stinner5cf47822020-11-02 22:03:28 +0100644static PyObject* ast2obj_arguments(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300645static const char * const arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100646 "posonlyargs",
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200647 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200648 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200649 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200650 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200651 "kwarg",
652 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000653};
Victor Stinner5cf47822020-11-02 22:03:28 +0100654static PyObject* ast2obj_arg(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300655static const char * const arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200656 "lineno",
657 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000658 "end_lineno",
659 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700660};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300661static const char * const arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200662 "arg",
663 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800664 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000665};
Victor Stinner5cf47822020-11-02 22:03:28 +0100666static PyObject* ast2obj_keyword(struct ast_state *state, void*);
Pablo Galindo168660b2020-04-02 00:47:39 +0100667static const char * const keyword_attributes[] = {
668 "lineno",
669 "col_offset",
670 "end_lineno",
671 "end_col_offset",
672};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300673static const char * const keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200674 "arg",
675 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000676};
Victor Stinner5cf47822020-11-02 22:03:28 +0100677static PyObject* ast2obj_alias(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300678static const char * const alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200679 "name",
680 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000681};
Victor Stinner5cf47822020-11-02 22:03:28 +0100682static PyObject* ast2obj_withitem(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300683static const char * const withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200684 "context_expr",
685 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500686};
Brandt Bucher145bf262021-02-26 14:51:55 -0800687static PyObject* ast2obj_match_case(struct ast_state *state, void*);
688static const char * const match_case_fields[]={
689 "pattern",
690 "guard",
691 "body",
692};
Victor Stinner5cf47822020-11-02 22:03:28 +0100693static PyObject* ast2obj_type_ignore(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300694static const char * const TypeIgnore_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800695 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700696 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800697};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000698
699
INADA Naokifc489082017-01-25 22:33:43 +0900700
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700701typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100702 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700703 PyObject *dict;
704} AST_object;
705
Benjamin Peterson1767e022012-03-14 21:50:29 -0500706static void
707ast_dealloc(AST_object *self)
708{
INADA Naokia6296d32017-08-24 14:55:17 +0900709 /* bpo-31095: UnTrack is needed before calling any callbacks */
Eddie Elizondo0247e802019-09-14 09:38:17 -0400710 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +0900711 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500712 Py_CLEAR(self->dict);
Eddie Elizondo0247e802019-09-14 09:38:17 -0400713 freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
714 assert(free_func != NULL);
715 free_func(self);
716 Py_DECREF(tp);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500717}
718
Neal Norwitz207c9f32008-03-31 04:42:11 +0000719static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700720ast_traverse(AST_object *self, visitproc visit, void *arg)
721{
Pablo Galindo1cf15af2020-05-27 10:03:38 +0100722 Py_VISIT(Py_TYPE(self));
Benjamin Peterson81071762012-07-08 11:03:46 -0700723 Py_VISIT(self->dict);
724 return 0;
725}
726
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300727static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700728ast_clear(AST_object *self)
729{
730 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300731 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700732}
733
734static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000735ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
736{
Victor Stinner5cf47822020-11-02 22:03:28 +0100737 struct ast_state *state = get_ast_state();
Victor Stinner1f764532020-07-04 23:18:15 +0200738 if (state == NULL) {
739 return -1;
740 }
741
Neal Norwitz207c9f32008-03-31 04:42:11 +0000742 Py_ssize_t i, numfields = 0;
743 int res = -1;
744 PyObject *key, *value, *fields;
Victor Stinner74419f02020-07-03 11:35:37 +0200745 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200746 goto cleanup;
747 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000748 if (fields) {
749 numfields = PySequence_Size(fields);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200750 if (numfields == -1) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000751 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200752 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000753 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900754
Neal Norwitz207c9f32008-03-31 04:42:11 +0000755 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900756 if (numfields < PyTuple_GET_SIZE(args)) {
757 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
758 "%zd positional argument%s",
Dino Viehlandac46eb42019-09-11 10:16:34 -0700759 _PyType_Name(Py_TYPE(self)),
INADA Naoki4c78c522017-02-24 02:48:17 +0900760 numfields, numfields == 1 ? "" : "s");
761 res = -1;
762 goto cleanup;
763 }
764 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
765 /* cannot be reached when fields is NULL */
766 PyObject *name = PySequence_GetItem(fields, i);
767 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000768 res = -1;
769 goto cleanup;
770 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900771 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
772 Py_DECREF(name);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200773 if (res < 0) {
INADA Naoki4c78c522017-02-24 02:48:17 +0900774 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200775 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000776 }
777 if (kw) {
778 i = 0; /* needed by PyDict_Next */
779 while (PyDict_Next(kw, &i, &key, &value)) {
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200780 int contains = PySequence_Contains(fields, key);
781 if (contains == -1) {
782 res = -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000783 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200784 } else if (contains == 1) {
785 Py_ssize_t p = PySequence_Index(fields, key);
786 if (p == -1) {
787 res = -1;
788 goto cleanup;
789 }
790 if (p < PyTuple_GET_SIZE(args)) {
791 PyErr_Format(PyExc_TypeError,
792 "%.400s got multiple values for argument '%U'",
793 Py_TYPE(self)->tp_name, key);
794 res = -1;
795 goto cleanup;
796 }
797 }
798 res = PyObject_SetAttr(self, key, value);
799 if (res < 0) {
800 goto cleanup;
801 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000802 }
803 }
804 cleanup:
805 Py_XDECREF(fields);
806 return res;
807}
808
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000809/* Pickling support */
810static PyObject *
811ast_type_reduce(PyObject *self, PyObject *unused)
812{
Victor Stinner5cf47822020-11-02 22:03:28 +0100813 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200814 if (state == NULL) {
815 return NULL;
816 }
817
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200818 PyObject *dict;
Victor Stinner74419f02020-07-03 11:35:37 +0200819 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200820 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000821 }
822 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200823 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000824 }
825 return Py_BuildValue("O()", Py_TYPE(self));
826}
827
Eddie Elizondo3368f3c2019-09-19 09:29:05 -0700828static PyMemberDef ast_type_members[] = {
829 {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY},
830 {NULL} /* Sentinel */
831};
832
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000833static PyMethodDef ast_type_methods[] = {
834 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
835 {NULL}
836};
837
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700838static PyGetSetDef ast_type_getsets[] = {
839 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
840 {NULL}
841};
842
Dino Viehlandac46eb42019-09-11 10:16:34 -0700843static PyType_Slot AST_type_slots[] = {
844 {Py_tp_dealloc, ast_dealloc},
845 {Py_tp_getattro, PyObject_GenericGetAttr},
846 {Py_tp_setattro, PyObject_GenericSetAttr},
847 {Py_tp_traverse, ast_traverse},
848 {Py_tp_clear, ast_clear},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -0700849 {Py_tp_members, ast_type_members},
Dino Viehlandac46eb42019-09-11 10:16:34 -0700850 {Py_tp_methods, ast_type_methods},
851 {Py_tp_getset, ast_type_getsets},
852 {Py_tp_init, ast_type_init},
853 {Py_tp_alloc, PyType_GenericAlloc},
854 {Py_tp_new, PyType_GenericNew},
Dino Viehlandac46eb42019-09-11 10:16:34 -0700855 {Py_tp_free, PyObject_GC_Del},
856 {0, 0},
857};
858
859static PyType_Spec AST_type_spec = {
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200860 "ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700861 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +0000862 0,
Dino Viehlandac46eb42019-09-11 10:16:34 -0700863 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
864 AST_type_slots
Neal Norwitz207c9f32008-03-31 04:42:11 +0000865};
866
Dino Viehlandac46eb42019-09-11 10:16:34 -0700867static PyObject *
Victor Stinner5cf47822020-11-02 22:03:28 +0100868make_type(struct ast_state *state, const char *type, PyObject* base,
Victor Stinner74419f02020-07-03 11:35:37 +0200869 const char* const* fields, int num_fields, const char *doc)
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000870{
871 PyObject *fnames, *result;
872 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000873 fnames = PyTuple_New(num_fields);
874 if (!fnames) return NULL;
875 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300876 PyObject *field = PyUnicode_InternFromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000877 if (!field) {
878 Py_DECREF(fnames);
879 return NULL;
880 }
881 PyTuple_SET_ITEM(fnames, i, field);
882 }
Brandt Bucher145bf262021-02-26 14:51:55 -0800883 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOOOs}",
INADA Naokifc489082017-01-25 22:33:43 +0900884 type, base,
Victor Stinner74419f02020-07-03 11:35:37 +0200885 state->_fields, fnames,
Brandt Bucher145bf262021-02-26 14:51:55 -0800886 state->__match_args__, fnames,
Victor Stinner74419f02020-07-03 11:35:37 +0200887 state->__module__,
888 state->ast,
889 state->__doc__, doc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000890 Py_DECREF(fnames);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700891 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000892}
893
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300894static int
Victor Stinner5cf47822020-11-02 22:03:28 +0100895add_attributes(struct ast_state *state, PyObject *type, const char * const *attrs, int num_fields)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000896{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000897 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000898 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +0000899 if (!l)
900 return 0;
901 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300902 s = PyUnicode_InternFromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000903 if (!s) {
904 Py_DECREF(l);
905 return 0;
906 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000907 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000908 }
Victor Stinner74419f02020-07-03 11:35:37 +0200909 result = PyObject_SetAttr(type, state->_attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000910 Py_DECREF(l);
911 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000912}
913
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000914/* Conversion AST -> Python */
915
Victor Stinner5cf47822020-11-02 22:03:28 +0100916static PyObject* ast2obj_list(struct ast_state *state, asdl_seq *seq, PyObject* (*func)(struct ast_state *state, void*))
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000917{
Benjamin Peterson77fa9372012-05-15 10:10:27 -0700918 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000919 PyObject *result = PyList_New(n);
920 PyObject *value;
921 if (!result)
922 return NULL;
923 for (i = 0; i < n; i++) {
Pablo Galindoa5634c42020-09-16 19:42:00 +0100924 value = func(state, asdl_seq_GET_UNTYPED(seq, i));
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000925 if (!value) {
926 Py_DECREF(result);
927 return NULL;
928 }
929 PyList_SET_ITEM(result, i, value);
930 }
931 return result;
932}
933
Victor Stinner5cf47822020-11-02 22:03:28 +0100934static PyObject* ast2obj_object(struct ast_state *Py_UNUSED(state), void *o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000935{
936 if (!o)
937 o = Py_None;
938 Py_INCREF((PyObject*)o);
939 return (PyObject*)o;
940}
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100941#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000942#define ast2obj_identifier ast2obj_object
943#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000944
Victor Stinner5cf47822020-11-02 22:03:28 +0100945static PyObject* ast2obj_int(struct ast_state *Py_UNUSED(state), long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000946{
Christian Heimes217cfd12007-12-02 14:31:20 +0000947 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000948}
949
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000950/* Conversion Python -> AST */
951
Victor Stinner5cf47822020-11-02 22:03:28 +0100952static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000953{
954 if (obj == Py_None)
955 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +0200956 if (obj) {
Victor Stinner8370e072021-03-24 02:23:01 +0100957 if (_PyArena_AddPyObject(arena, obj) < 0) {
Christian Heimes70c94e72013-07-27 00:33:13 +0200958 *out = NULL;
959 return -1;
960 }
961 Py_INCREF(obj);
962 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000963 *out = obj;
964 return 0;
965}
966
Victor Stinner5cf47822020-11-02 22:03:28 +0100967static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100968{
Victor Stinner8370e072021-03-24 02:23:01 +0100969 if (_PyArena_AddPyObject(arena, obj) < 0) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300970 *out = NULL;
971 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100972 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300973 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100974 *out = obj;
975 return 0;
976}
977
Victor Stinner5cf47822020-11-02 22:03:28 +0100978static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500979{
Benjamin Peterson180e6352011-07-22 11:09:07 -0500980 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
981 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500982 return 1;
983 }
Victor Stinner74419f02020-07-03 11:35:37 +0200984 return obj2ast_object(state, obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500985}
986
Victor Stinner5cf47822020-11-02 22:03:28 +0100987static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800988{
989 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
990 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
991 return 1;
992 }
Victor Stinner74419f02020-07-03 11:35:37 +0200993 return obj2ast_object(state, obj, out, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800994}
995
Victor Stinner5cf47822020-11-02 22:03:28 +0100996static int obj2ast_int(struct ast_state* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000997{
998 int i;
999 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +01001000 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001001 return 1;
1002 }
1003
Serhiy Storchaka56f6e762015-09-06 21:25:30 +03001004 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001005 if (i == -1 && PyErr_Occurred())
1006 return 1;
1007 *out = i;
1008 return 0;
1009}
1010
Victor Stinner5cf47822020-11-02 22:03:28 +01001011static int add_ast_fields(struct ast_state *state)
Benjamin Petersonce825f12008-10-24 23:11:02 +00001012{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001013 PyObject *empty_tuple;
Benjamin Petersonce825f12008-10-24 23:11:02 +00001014 empty_tuple = PyTuple_New(0);
1015 if (!empty_tuple ||
Victor Stinner74419f02020-07-03 11:35:37 +02001016 PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 ||
Brandt Bucher145bf262021-02-26 14:51:55 -08001017 PyObject_SetAttrString(state->AST_type, "__match_args__", empty_tuple) < 0 ||
Victor Stinner74419f02020-07-03 11:35:37 +02001018 PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +00001019 Py_XDECREF(empty_tuple);
1020 return -1;
1021 }
1022 Py_DECREF(empty_tuple);
1023 return 0;
1024}
1025
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001026
Victor Stinnerfd957c12020-11-03 18:07:15 +01001027
1028static int
1029init_types(struct ast_state *state)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001030{
Victor Stinnerfd957c12020-11-03 18:07:15 +01001031 // init_types() must not be called after _PyAST_Fini()
1032 // has been called
1033 assert(state->initialized >= 0);
1034
1035 if (state->initialized) {
1036 return 1;
1037 }
1038 if (init_identifiers(state) < 0) {
1039 return 0;
1040 }
Dino Viehlandac46eb42019-09-11 10:16:34 -07001041 state->AST_type = PyType_FromSpec(&AST_type_spec);
Victor Stinnerfd957c12020-11-03 18:07:15 +01001042 if (!state->AST_type) {
1043 return 0;
1044 }
1045 if (add_ast_fields(state) < 0) {
1046 return 0;
1047 }
Victor Stinner74419f02020-07-03 11:35:37 +02001048 state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001049 "mod = Module(stmt* body, type_ignore* type_ignores)\n"
1050 " | Interactive(stmt* body)\n"
1051 " | Expression(expr body)\n"
1052 " | FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001053 if (!state->mod_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001054 if (!add_attributes(state, state->mod_type, NULL, 0)) return 0;
1055 state->Module_type = make_type(state, "Module", state->mod_type,
1056 Module_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001057 "Module(stmt* body, type_ignore* type_ignores)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001058 if (!state->Module_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001059 state->Interactive_type = make_type(state, "Interactive", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001060 Interactive_fields, 1,
1061 "Interactive(stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001062 if (!state->Interactive_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001063 state->Expression_type = make_type(state, "Expression", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001064 Expression_fields, 1,
1065 "Expression(expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001066 if (!state->Expression_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001067 state->FunctionType_type = make_type(state, "FunctionType",
1068 state->mod_type, FunctionType_fields,
1069 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001070 "FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001071 if (!state->FunctionType_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001072 state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001073 "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1074 " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1075 " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
1076 " | Return(expr? value)\n"
1077 " | Delete(expr* targets)\n"
1078 " | Assign(expr* targets, expr value, string? type_comment)\n"
1079 " | AugAssign(expr target, operator op, expr value)\n"
1080 " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
1081 " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1082 " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1083 " | While(expr test, stmt* body, stmt* orelse)\n"
1084 " | If(expr test, stmt* body, stmt* orelse)\n"
1085 " | With(withitem* items, stmt* body, string? type_comment)\n"
1086 " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n"
Brandt Bucher145bf262021-02-26 14:51:55 -08001087 " | Match(expr subject, match_case* cases)\n"
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001088 " | Raise(expr? exc, expr? cause)\n"
1089 " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n"
1090 " | Assert(expr test, expr? msg)\n"
1091 " | Import(alias* names)\n"
1092 " | ImportFrom(identifier? module, alias* names, int? level)\n"
1093 " | Global(identifier* names)\n"
1094 " | Nonlocal(identifier* names)\n"
1095 " | Expr(expr value)\n"
1096 " | Pass\n"
1097 " | Break\n"
1098 " | Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001099 if (!state->stmt_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001100 if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001101 if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1)
1102 return 0;
1103 if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) ==
1104 -1)
1105 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001106 state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001107 FunctionDef_fields, 6,
1108 "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001109 if (!state->FunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001110 if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
1111 -1)
1112 return 0;
1113 if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None)
1114 == -1)
1115 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001116 state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001117 state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001118 AsyncFunctionDef_fields, 6,
1119 "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001120 if (!state->AsyncFunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001121 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
1122 == -1)
1123 return 0;
1124 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment,
1125 Py_None) == -1)
1126 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001127 state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001128 ClassDef_fields, 5,
1129 "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001130 if (!state->ClassDef_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001131 state->Return_type = make_type(state, "Return", state->stmt_type,
1132 Return_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001133 "Return(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001134 if (!state->Return_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001135 if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1)
1136 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001137 state->Delete_type = make_type(state, "Delete", state->stmt_type,
1138 Delete_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001139 "Delete(expr* targets)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001140 if (!state->Delete_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001141 state->Assign_type = make_type(state, "Assign", state->stmt_type,
1142 Assign_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001143 "Assign(expr* targets, expr value, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001144 if (!state->Assign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001145 if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
1146 -1)
1147 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001148 state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001149 AugAssign_fields, 3,
1150 "AugAssign(expr target, operator op, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001151 if (!state->AugAssign_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001152 state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001153 AnnAssign_fields, 4,
1154 "AnnAssign(expr target, expr annotation, expr? value, int simple)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001155 if (!state->AnnAssign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001156 if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1)
1157 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001158 state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001159 "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001160 if (!state->For_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001161 if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1)
1162 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001163 state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001164 AsyncFor_fields, 5,
1165 "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001166 if (!state->AsyncFor_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001167 if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) ==
1168 -1)
1169 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001170 state->While_type = make_type(state, "While", state->stmt_type,
1171 While_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001172 "While(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001173 if (!state->While_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001174 state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001175 "If(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001176 if (!state->If_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001177 state->With_type = make_type(state, "With", state->stmt_type, With_fields,
1178 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001179 "With(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001180 if (!state->With_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001181 if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1)
1182 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001183 state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001184 AsyncWith_fields, 3,
1185 "AsyncWith(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001186 if (!state->AsyncWith_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001187 if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None)
1188 == -1)
1189 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001190 state->Match_type = make_type(state, "Match", state->stmt_type,
1191 Match_fields, 2,
1192 "Match(expr subject, match_case* cases)");
1193 if (!state->Match_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001194 state->Raise_type = make_type(state, "Raise", state->stmt_type,
1195 Raise_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001196 "Raise(expr? exc, expr? cause)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001197 if (!state->Raise_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001198 if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1)
1199 return 0;
1200 if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1)
1201 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001202 state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001203 "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001204 if (!state->Try_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001205 state->Assert_type = make_type(state, "Assert", state->stmt_type,
1206 Assert_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001207 "Assert(expr test, expr? msg)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001208 if (!state->Assert_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001209 if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1)
1210 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001211 state->Import_type = make_type(state, "Import", state->stmt_type,
1212 Import_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001213 "Import(alias* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001214 if (!state->Import_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001215 state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001216 ImportFrom_fields, 3,
1217 "ImportFrom(identifier? module, alias* names, int? level)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001218 if (!state->ImportFrom_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001219 if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1)
1220 return 0;
1221 if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1)
1222 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001223 state->Global_type = make_type(state, "Global", state->stmt_type,
1224 Global_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001225 "Global(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001226 if (!state->Global_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001227 state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001228 Nonlocal_fields, 1,
1229 "Nonlocal(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001230 if (!state->Nonlocal_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001231 state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields,
1232 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001233 "Expr(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001234 if (!state->Expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001235 state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001236 "Pass");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001237 if (!state->Pass_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001238 state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001239 "Break");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001240 if (!state->Break_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001241 state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL,
1242 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001243 "Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001244 if (!state->Continue_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001245 state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001246 "expr = BoolOp(boolop op, expr* values)\n"
1247 " | NamedExpr(expr target, expr value)\n"
1248 " | BinOp(expr left, operator op, expr right)\n"
1249 " | UnaryOp(unaryop op, expr operand)\n"
1250 " | Lambda(arguments args, expr body)\n"
1251 " | IfExp(expr test, expr body, expr orelse)\n"
1252 " | Dict(expr* keys, expr* values)\n"
1253 " | Set(expr* elts)\n"
1254 " | ListComp(expr elt, comprehension* generators)\n"
1255 " | SetComp(expr elt, comprehension* generators)\n"
1256 " | DictComp(expr key, expr value, comprehension* generators)\n"
1257 " | GeneratorExp(expr elt, comprehension* generators)\n"
1258 " | Await(expr value)\n"
1259 " | Yield(expr? value)\n"
1260 " | YieldFrom(expr value)\n"
1261 " | Compare(expr left, cmpop* ops, expr* comparators)\n"
1262 " | Call(expr func, expr* args, keyword* keywords)\n"
1263 " | FormattedValue(expr value, int? conversion, expr? format_spec)\n"
1264 " | JoinedStr(expr* values)\n"
1265 " | Constant(constant value, string? kind)\n"
1266 " | Attribute(expr value, identifier attr, expr_context ctx)\n"
1267 " | Subscript(expr value, expr slice, expr_context ctx)\n"
1268 " | Starred(expr value, expr_context ctx)\n"
1269 " | Name(identifier id, expr_context ctx)\n"
1270 " | List(expr* elts, expr_context ctx)\n"
1271 " | Tuple(expr* elts, expr_context ctx)\n"
Brandt Bucher145bf262021-02-26 14:51:55 -08001272 " | Slice(expr? lower, expr? upper, expr? step)\n"
1273 " | MatchAs(expr pattern, identifier name)\n"
1274 " | MatchOr(expr* patterns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001275 if (!state->expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001276 if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001277 if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1)
1278 return 0;
1279 if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) ==
1280 -1)
1281 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001282 state->BoolOp_type = make_type(state, "BoolOp", state->expr_type,
1283 BoolOp_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001284 "BoolOp(boolop op, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001285 if (!state->BoolOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001286 state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001287 NamedExpr_fields, 2,
1288 "NamedExpr(expr target, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001289 if (!state->NamedExpr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001290 state->BinOp_type = make_type(state, "BinOp", state->expr_type,
1291 BinOp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001292 "BinOp(expr left, operator op, expr right)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001293 if (!state->BinOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001294 state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001295 UnaryOp_fields, 2,
1296 "UnaryOp(unaryop op, expr operand)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001297 if (!state->UnaryOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001298 state->Lambda_type = make_type(state, "Lambda", state->expr_type,
1299 Lambda_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001300 "Lambda(arguments args, expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001301 if (!state->Lambda_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001302 state->IfExp_type = make_type(state, "IfExp", state->expr_type,
1303 IfExp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001304 "IfExp(expr test, expr body, expr orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001305 if (!state->IfExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001306 state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields,
1307 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001308 "Dict(expr* keys, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001309 if (!state->Dict_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001310 state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001311 "Set(expr* elts)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001312 if (!state->Set_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001313 state->ListComp_type = make_type(state, "ListComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001314 ListComp_fields, 2,
1315 "ListComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001316 if (!state->ListComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001317 state->SetComp_type = make_type(state, "SetComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001318 SetComp_fields, 2,
1319 "SetComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001320 if (!state->SetComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001321 state->DictComp_type = make_type(state, "DictComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001322 DictComp_fields, 3,
1323 "DictComp(expr key, expr value, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001324 if (!state->DictComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001325 state->GeneratorExp_type = make_type(state, "GeneratorExp",
1326 state->expr_type, GeneratorExp_fields,
1327 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001328 "GeneratorExp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001329 if (!state->GeneratorExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001330 state->Await_type = make_type(state, "Await", state->expr_type,
1331 Await_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001332 "Await(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001333 if (!state->Await_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001334 state->Yield_type = make_type(state, "Yield", state->expr_type,
1335 Yield_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001336 "Yield(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001337 if (!state->Yield_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001338 if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1)
1339 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001340 state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001341 YieldFrom_fields, 1,
1342 "YieldFrom(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001343 if (!state->YieldFrom_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001344 state->Compare_type = make_type(state, "Compare", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001345 Compare_fields, 3,
1346 "Compare(expr left, cmpop* ops, expr* comparators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001347 if (!state->Compare_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001348 state->Call_type = make_type(state, "Call", state->expr_type, Call_fields,
1349 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001350 "Call(expr func, expr* args, keyword* keywords)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001351 if (!state->Call_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001352 state->FormattedValue_type = make_type(state, "FormattedValue",
1353 state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001354 FormattedValue_fields, 3,
1355 "FormattedValue(expr value, int? conversion, expr? format_spec)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001356 if (!state->FormattedValue_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001357 if (PyObject_SetAttr(state->FormattedValue_type, state->conversion,
1358 Py_None) == -1)
1359 return 0;
1360 if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
1361 Py_None) == -1)
1362 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001363 state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001364 JoinedStr_fields, 1,
1365 "JoinedStr(expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001366 if (!state->JoinedStr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001367 state->Constant_type = make_type(state, "Constant", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001368 Constant_fields, 2,
1369 "Constant(constant value, string? kind)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001370 if (!state->Constant_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001371 if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1)
1372 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001373 state->Attribute_type = make_type(state, "Attribute", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001374 Attribute_fields, 3,
1375 "Attribute(expr value, identifier attr, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001376 if (!state->Attribute_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001377 state->Subscript_type = make_type(state, "Subscript", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001378 Subscript_fields, 3,
1379 "Subscript(expr value, expr slice, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001380 if (!state->Subscript_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001381 state->Starred_type = make_type(state, "Starred", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001382 Starred_fields, 2,
1383 "Starred(expr value, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001384 if (!state->Starred_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001385 state->Name_type = make_type(state, "Name", state->expr_type, Name_fields,
1386 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001387 "Name(identifier id, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001388 if (!state->Name_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001389 state->List_type = make_type(state, "List", state->expr_type, List_fields,
1390 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001391 "List(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001392 if (!state->List_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001393 state->Tuple_type = make_type(state, "Tuple", state->expr_type,
1394 Tuple_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001395 "Tuple(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001396 if (!state->Tuple_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001397 state->Slice_type = make_type(state, "Slice", state->expr_type,
1398 Slice_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001399 "Slice(expr? lower, expr? upper, expr? step)");
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001400 if (!state->Slice_type) return 0;
1401 if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1)
1402 return 0;
1403 if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1)
1404 return 0;
1405 if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1)
1406 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001407 state->MatchAs_type = make_type(state, "MatchAs", state->expr_type,
1408 MatchAs_fields, 2,
1409 "MatchAs(expr pattern, identifier name)");
1410 if (!state->MatchAs_type) return 0;
1411 state->MatchOr_type = make_type(state, "MatchOr", state->expr_type,
1412 MatchOr_fields, 1,
1413 "MatchOr(expr* patterns)");
1414 if (!state->MatchOr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001415 state->expr_context_type = make_type(state, "expr_context",
1416 state->AST_type, NULL, 0,
Serhiy Storchaka6b975982020-03-17 23:41:08 +02001417 "expr_context = Load | Store | Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001418 if (!state->expr_context_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001419 if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0;
1420 state->Load_type = make_type(state, "Load", state->expr_context_type, NULL,
1421 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001422 "Load");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001423 if (!state->Load_type) return 0;
1424 state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type,
1425 NULL, NULL);
1426 if (!state->Load_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001427 state->Store_type = make_type(state, "Store", state->expr_context_type,
1428 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001429 "Store");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001430 if (!state->Store_type) return 0;
1431 state->Store_singleton = PyType_GenericNew((PyTypeObject
1432 *)state->Store_type, NULL, NULL);
1433 if (!state->Store_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001434 state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001435 "Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001436 if (!state->Del_type) return 0;
1437 state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type,
1438 NULL, NULL);
1439 if (!state->Del_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001440 state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001441 "boolop = And | Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001442 if (!state->boolop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001443 if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0;
1444 state->And_type = make_type(state, "And", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001445 "And");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001446 if (!state->And_type) return 0;
1447 state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type,
1448 NULL, NULL);
1449 if (!state->And_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001450 state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001451 "Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001452 if (!state->Or_type) return 0;
1453 state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type,
1454 NULL, NULL);
1455 if (!state->Or_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001456 state->operator_type = make_type(state, "operator", state->AST_type, NULL,
1457 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001458 "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001459 if (!state->operator_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001460 if (!add_attributes(state, state->operator_type, NULL, 0)) return 0;
1461 state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001462 "Add");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001463 if (!state->Add_type) return 0;
1464 state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type,
1465 NULL, NULL);
1466 if (!state->Add_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001467 state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001468 "Sub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001469 if (!state->Sub_type) return 0;
1470 state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type,
1471 NULL, NULL);
1472 if (!state->Sub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001473 state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001474 "Mult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001475 if (!state->Mult_type) return 0;
1476 state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type,
1477 NULL, NULL);
1478 if (!state->Mult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001479 state->MatMult_type = make_type(state, "MatMult", state->operator_type,
1480 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001481 "MatMult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001482 if (!state->MatMult_type) return 0;
1483 state->MatMult_singleton = PyType_GenericNew((PyTypeObject
1484 *)state->MatMult_type, NULL,
1485 NULL);
1486 if (!state->MatMult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001487 state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001488 "Div");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001489 if (!state->Div_type) return 0;
1490 state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type,
1491 NULL, NULL);
1492 if (!state->Div_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001493 state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001494 "Mod");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001495 if (!state->Mod_type) return 0;
1496 state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type,
1497 NULL, NULL);
1498 if (!state->Mod_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001499 state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001500 "Pow");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001501 if (!state->Pow_type) return 0;
1502 state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type,
1503 NULL, NULL);
1504 if (!state->Pow_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001505 state->LShift_type = make_type(state, "LShift", state->operator_type, NULL,
1506 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001507 "LShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001508 if (!state->LShift_type) return 0;
1509 state->LShift_singleton = PyType_GenericNew((PyTypeObject
1510 *)state->LShift_type, NULL,
1511 NULL);
1512 if (!state->LShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001513 state->RShift_type = make_type(state, "RShift", state->operator_type, NULL,
1514 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001515 "RShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001516 if (!state->RShift_type) return 0;
1517 state->RShift_singleton = PyType_GenericNew((PyTypeObject
1518 *)state->RShift_type, NULL,
1519 NULL);
1520 if (!state->RShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001521 state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001522 "BitOr");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001523 if (!state->BitOr_type) return 0;
1524 state->BitOr_singleton = PyType_GenericNew((PyTypeObject
1525 *)state->BitOr_type, NULL, NULL);
1526 if (!state->BitOr_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001527 state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL,
1528 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001529 "BitXor");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001530 if (!state->BitXor_type) return 0;
1531 state->BitXor_singleton = PyType_GenericNew((PyTypeObject
1532 *)state->BitXor_type, NULL,
1533 NULL);
1534 if (!state->BitXor_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001535 state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL,
1536 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001537 "BitAnd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001538 if (!state->BitAnd_type) return 0;
1539 state->BitAnd_singleton = PyType_GenericNew((PyTypeObject
1540 *)state->BitAnd_type, NULL,
1541 NULL);
1542 if (!state->BitAnd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001543 state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type,
1544 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001545 "FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001546 if (!state->FloorDiv_type) return 0;
1547 state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject
1548 *)state->FloorDiv_type, NULL,
1549 NULL);
1550 if (!state->FloorDiv_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001551 state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001552 "unaryop = Invert | Not | UAdd | USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001553 if (!state->unaryop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001554 if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0;
1555 state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL,
1556 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001557 "Invert");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001558 if (!state->Invert_type) return 0;
1559 state->Invert_singleton = PyType_GenericNew((PyTypeObject
1560 *)state->Invert_type, NULL,
1561 NULL);
1562 if (!state->Invert_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001563 state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001564 "Not");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001565 if (!state->Not_type) return 0;
1566 state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type,
1567 NULL, NULL);
1568 if (!state->Not_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001569 state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001570 "UAdd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001571 if (!state->UAdd_type) return 0;
1572 state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type,
1573 NULL, NULL);
1574 if (!state->UAdd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001575 state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001576 "USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001577 if (!state->USub_type) return 0;
1578 state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type,
1579 NULL, NULL);
1580 if (!state->USub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001581 state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001582 "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001583 if (!state->cmpop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001584 if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0;
1585 state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001586 "Eq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001587 if (!state->Eq_type) return 0;
1588 state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type,
1589 NULL, NULL);
1590 if (!state->Eq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001591 state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001592 "NotEq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001593 if (!state->NotEq_type) return 0;
1594 state->NotEq_singleton = PyType_GenericNew((PyTypeObject
1595 *)state->NotEq_type, NULL, NULL);
1596 if (!state->NotEq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001597 state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001598 "Lt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001599 if (!state->Lt_type) return 0;
1600 state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type,
1601 NULL, NULL);
1602 if (!state->Lt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001603 state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001604 "LtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001605 if (!state->LtE_type) return 0;
1606 state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type,
1607 NULL, NULL);
1608 if (!state->LtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001609 state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001610 "Gt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001611 if (!state->Gt_type) return 0;
1612 state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type,
1613 NULL, NULL);
1614 if (!state->Gt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001615 state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001616 "GtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001617 if (!state->GtE_type) return 0;
1618 state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type,
1619 NULL, NULL);
1620 if (!state->GtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001621 state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001622 "Is");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001623 if (!state->Is_type) return 0;
1624 state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type,
1625 NULL, NULL);
1626 if (!state->Is_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001627 state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001628 "IsNot");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001629 if (!state->IsNot_type) return 0;
1630 state->IsNot_singleton = PyType_GenericNew((PyTypeObject
1631 *)state->IsNot_type, NULL, NULL);
1632 if (!state->IsNot_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001633 state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001634 "In");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001635 if (!state->In_type) return 0;
1636 state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type,
1637 NULL, NULL);
1638 if (!state->In_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001639 state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001640 "NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001641 if (!state->NotIn_type) return 0;
1642 state->NotIn_singleton = PyType_GenericNew((PyTypeObject
1643 *)state->NotIn_type, NULL, NULL);
1644 if (!state->NotIn_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001645 state->comprehension_type = make_type(state, "comprehension",
1646 state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001647 comprehension_fields, 4,
1648 "comprehension(expr target, expr iter, expr* ifs, int is_async)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001649 if (!state->comprehension_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001650 if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0;
1651 state->excepthandler_type = make_type(state, "excepthandler",
1652 state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001653 "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001654 if (!state->excepthandler_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001655 if (!add_attributes(state, state->excepthandler_type,
1656 excepthandler_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001657 if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None)
1658 == -1)
1659 return 0;
1660 if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset,
1661 Py_None) == -1)
1662 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001663 state->ExceptHandler_type = make_type(state, "ExceptHandler",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001664 state->excepthandler_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001665 ExceptHandler_fields, 3,
1666 "ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001667 if (!state->ExceptHandler_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001668 if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1)
1669 return 0;
1670 if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1)
1671 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001672 state->arguments_type = make_type(state, "arguments", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001673 arguments_fields, 7,
1674 "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001675 if (!state->arguments_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001676 if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001677 if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1)
1678 return 0;
1679 if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1)
1680 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001681 state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001682 "arg(identifier arg, expr? annotation, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001683 if (!state->arg_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001684 if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001685 if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1)
1686 return 0;
1687 if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1)
1688 return 0;
1689 if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1)
1690 return 0;
1691 if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1)
1692 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001693 state->keyword_type = make_type(state, "keyword", state->AST_type,
1694 keyword_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001695 "keyword(identifier? arg, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001696 if (!state->keyword_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001697 if (!add_attributes(state, state->keyword_type, keyword_attributes, 4))
1698 return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001699 if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1)
1700 return 0;
Pablo Galindo168660b2020-04-02 00:47:39 +01001701 if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1)
1702 return 0;
1703 if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None)
1704 == -1)
1705 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001706 state->alias_type = make_type(state, "alias", state->AST_type,
1707 alias_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001708 "alias(identifier name, identifier? asname)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001709 if (!state->alias_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001710 if (!add_attributes(state, state->alias_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001711 if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1)
1712 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001713 state->withitem_type = make_type(state, "withitem", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001714 withitem_fields, 2,
1715 "withitem(expr context_expr, expr? optional_vars)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001716 if (!state->withitem_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001717 if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001718 if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None)
1719 == -1)
1720 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08001721 state->match_case_type = make_type(state, "match_case", state->AST_type,
1722 match_case_fields, 3,
1723 "match_case(expr pattern, expr? guard, stmt* body)");
1724 if (!state->match_case_type) return 0;
1725 if (!add_attributes(state, state->match_case_type, NULL, 0)) return 0;
1726 if (PyObject_SetAttr(state->match_case_type, state->guard, Py_None) == -1)
1727 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001728 state->type_ignore_type = make_type(state, "type_ignore", state->AST_type,
1729 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001730 "type_ignore = TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001731 if (!state->type_ignore_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001732 if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0;
1733 state->TypeIgnore_type = make_type(state, "TypeIgnore",
1734 state->type_ignore_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001735 TypeIgnore_fields, 2,
1736 "TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001737 if (!state->TypeIgnore_type) return 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +01001738
Dino Viehlandac46eb42019-09-11 10:16:34 -07001739 state->initialized = 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001740 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001741}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001742
Victor Stinner5cf47822020-11-02 22:03:28 +01001743static int obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001744 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001745static int obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001746 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001747static int obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001748 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001749static int obj2ast_expr_context(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001750 expr_context_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001751static int obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty*
1752 out, PyArena* arena);
1753static int obj2ast_operator(struct ast_state *state, PyObject* obj,
1754 operator_ty* out, PyArena* arena);
1755static int obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02001756 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001757static int obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001758 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001759static int obj2ast_comprehension(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001760 comprehension_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001761static int obj2ast_excepthandler(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001762 excepthandler_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001763static int obj2ast_arguments(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001764 arguments_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001765static int obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001766 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001767static int obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02001768 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001769static int obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001770 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001771static int obj2ast_withitem(struct ast_state *state, PyObject* obj,
1772 withitem_ty* out, PyArena* arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08001773static int obj2ast_match_case(struct ast_state *state, PyObject* obj,
1774 match_case_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001775static int obj2ast_type_ignore(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001776 type_ignore_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778mod_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001779_Py_Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, PyArena
1780 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001782 mod_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01001783 p = (mod_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001784 if (!p)
1785 return NULL;
1786 p->kind = Module_kind;
1787 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001788 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001789 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790}
1791
1792mod_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001793_Py_Interactive(asdl_stmt_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001795 mod_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01001796 p = (mod_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001797 if (!p)
1798 return NULL;
1799 p->kind = Interactive_kind;
1800 p->v.Interactive.body = body;
1801 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001802}
1803
1804mod_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001805_Py_Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001806{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001807 mod_ty p;
1808 if (!body) {
1809 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001810 "field 'body' is required for Expression");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001811 return NULL;
1812 }
Victor Stinner8370e072021-03-24 02:23:01 +01001813 p = (mod_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001814 if (!p)
1815 return NULL;
1816 p->kind = Expression_kind;
1817 p->v.Expression.body = body;
1818 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819}
1820
1821mod_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001822_Py_FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001823{
1824 mod_ty p;
1825 if (!returns) {
1826 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001827 "field 'returns' is required for FunctionType");
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001828 return NULL;
1829 }
Victor Stinner8370e072021-03-24 02:23:01 +01001830 p = (mod_ty)_PyArena_Malloc(arena, sizeof(*p));
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001831 if (!p)
1832 return NULL;
1833 p->kind = FunctionType_kind;
1834 p->v.FunctionType.argtypes = argtypes;
1835 p->v.FunctionType.returns = returns;
1836 return p;
1837}
1838
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001839stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001840_Py_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
1841 asdl_expr_seq * decorator_list, expr_ty returns, string
1842 type_comment, int lineno, int col_offset, int end_lineno, int
1843 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001845 stmt_ty p;
1846 if (!name) {
1847 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001848 "field 'name' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001849 return NULL;
1850 }
1851 if (!args) {
1852 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001853 "field 'args' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001854 return NULL;
1855 }
Victor Stinner8370e072021-03-24 02:23:01 +01001856 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001857 if (!p)
1858 return NULL;
1859 p->kind = FunctionDef_kind;
1860 p->v.FunctionDef.name = name;
1861 p->v.FunctionDef.args = args;
1862 p->v.FunctionDef.body = body;
1863 p->v.FunctionDef.decorator_list = decorator_list;
1864 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001865 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001866 p->lineno = lineno;
1867 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001868 p->end_lineno = end_lineno;
1869 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001870 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871}
1872
1873stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001874_Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
1875 asdl_expr_seq * decorator_list, expr_ty returns, string
1876 type_comment, int lineno, int col_offset, int end_lineno,
1877 int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04001878{
1879 stmt_ty p;
1880 if (!name) {
1881 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001882 "field 'name' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04001883 return NULL;
1884 }
1885 if (!args) {
1886 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001887 "field 'args' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04001888 return NULL;
1889 }
Victor Stinner8370e072021-03-24 02:23:01 +01001890 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Yury Selivanov75445082015-05-11 22:57:16 -04001891 if (!p)
1892 return NULL;
1893 p->kind = AsyncFunctionDef_kind;
1894 p->v.AsyncFunctionDef.name = name;
1895 p->v.AsyncFunctionDef.args = args;
1896 p->v.AsyncFunctionDef.body = body;
1897 p->v.AsyncFunctionDef.decorator_list = decorator_list;
1898 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001899 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04001900 p->lineno = lineno;
1901 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001902 p->end_lineno = end_lineno;
1903 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04001904 return p;
1905}
1906
1907stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001908_Py_ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq *
1909 keywords, asdl_stmt_seq * body, asdl_expr_seq * decorator_list,
1910 int lineno, int col_offset, int end_lineno, int end_col_offset,
1911 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001913 stmt_ty p;
1914 if (!name) {
1915 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001916 "field 'name' is required for ClassDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001917 return NULL;
1918 }
Victor Stinner8370e072021-03-24 02:23:01 +01001919 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001920 if (!p)
1921 return NULL;
1922 p->kind = ClassDef_kind;
1923 p->v.ClassDef.name = name;
1924 p->v.ClassDef.bases = bases;
1925 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001926 p->v.ClassDef.body = body;
1927 p->v.ClassDef.decorator_list = decorator_list;
1928 p->lineno = lineno;
1929 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001930 p->end_lineno = end_lineno;
1931 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001932 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933}
1934
1935stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001936_Py_Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
1937 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001938{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001939 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01001940 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001941 if (!p)
1942 return NULL;
1943 p->kind = Return_kind;
1944 p->v.Return.value = value;
1945 p->lineno = lineno;
1946 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001947 p->end_lineno = end_lineno;
1948 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001949 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001950}
1951
1952stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001953_Py_Delete(asdl_expr_seq * targets, int lineno, int col_offset, int end_lineno,
1954 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001956 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01001957 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001958 if (!p)
1959 return NULL;
1960 p->kind = Delete_kind;
1961 p->v.Delete.targets = targets;
1962 p->lineno = lineno;
1963 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001964 p->end_lineno = end_lineno;
1965 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001966 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967}
1968
1969stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001970_Py_Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, int
1971 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
1972 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001974 stmt_ty p;
1975 if (!value) {
1976 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001977 "field 'value' is required for Assign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001978 return NULL;
1979 }
Victor Stinner8370e072021-03-24 02:23:01 +01001980 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001981 if (!p)
1982 return NULL;
1983 p->kind = Assign_kind;
1984 p->v.Assign.targets = targets;
1985 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001986 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001987 p->lineno = lineno;
1988 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001989 p->end_lineno = end_lineno;
1990 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001991 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992}
1993
1994stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02001995_Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
1996 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001998 stmt_ty p;
1999 if (!target) {
2000 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002001 "field 'target' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002002 return NULL;
2003 }
2004 if (!op) {
2005 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002006 "field 'op' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002007 return NULL;
2008 }
2009 if (!value) {
2010 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002011 "field 'value' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002012 return NULL;
2013 }
Victor Stinner8370e072021-03-24 02:23:01 +01002014 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002015 if (!p)
2016 return NULL;
2017 p->kind = AugAssign_kind;
2018 p->v.AugAssign.target = target;
2019 p->v.AugAssign.op = op;
2020 p->v.AugAssign.value = value;
2021 p->lineno = lineno;
2022 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002023 p->end_lineno = end_lineno;
2024 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002025 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
2028stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002029_Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple,
2030 int lineno, int col_offset, int end_lineno, int end_col_offset,
2031 PyArena *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002032{
2033 stmt_ty p;
2034 if (!target) {
2035 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002036 "field 'target' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002037 return NULL;
2038 }
2039 if (!annotation) {
2040 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002041 "field 'annotation' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002042 return NULL;
2043 }
Victor Stinner8370e072021-03-24 02:23:01 +01002044 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002045 if (!p)
2046 return NULL;
2047 p->kind = AnnAssign_kind;
2048 p->v.AnnAssign.target = target;
2049 p->v.AnnAssign.annotation = annotation;
2050 p->v.AnnAssign.value = value;
2051 p->v.AnnAssign.simple = simple;
2052 p->lineno = lineno;
2053 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002054 p->end_lineno = end_lineno;
2055 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002056 return p;
2057}
2058
2059stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002060_Py_For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq *
2061 orelse, string type_comment, int lineno, int col_offset, int
2062 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002064 stmt_ty p;
2065 if (!target) {
2066 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002067 "field 'target' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002068 return NULL;
2069 }
2070 if (!iter) {
2071 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002072 "field 'iter' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002073 return NULL;
2074 }
Victor Stinner8370e072021-03-24 02:23:01 +01002075 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002076 if (!p)
2077 return NULL;
2078 p->kind = For_kind;
2079 p->v.For.target = target;
2080 p->v.For.iter = iter;
2081 p->v.For.body = body;
2082 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002083 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002084 p->lineno = lineno;
2085 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002086 p->end_lineno = end_lineno;
2087 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002088 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002089}
2090
2091stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002092_Py_AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq
2093 * orelse, string type_comment, int lineno, int col_offset, int
2094 end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002095{
2096 stmt_ty p;
2097 if (!target) {
2098 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002099 "field 'target' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002100 return NULL;
2101 }
2102 if (!iter) {
2103 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002104 "field 'iter' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002105 return NULL;
2106 }
Victor Stinner8370e072021-03-24 02:23:01 +01002107 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Yury Selivanov75445082015-05-11 22:57:16 -04002108 if (!p)
2109 return NULL;
2110 p->kind = AsyncFor_kind;
2111 p->v.AsyncFor.target = target;
2112 p->v.AsyncFor.iter = iter;
2113 p->v.AsyncFor.body = body;
2114 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002115 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002116 p->lineno = lineno;
2117 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002118 p->end_lineno = end_lineno;
2119 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002120 return p;
2121}
2122
2123stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002124_Py_While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int
2125 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2126 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002128 stmt_ty p;
2129 if (!test) {
2130 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002131 "field 'test' is required for While");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002132 return NULL;
2133 }
Victor Stinner8370e072021-03-24 02:23:01 +01002134 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002135 if (!p)
2136 return NULL;
2137 p->kind = While_kind;
2138 p->v.While.test = test;
2139 p->v.While.body = body;
2140 p->v.While.orelse = orelse;
2141 p->lineno = lineno;
2142 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002143 p->end_lineno = end_lineno;
2144 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002145 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146}
2147
2148stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002149_Py_If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno,
2150 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002151{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002152 stmt_ty p;
2153 if (!test) {
2154 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002155 "field 'test' is required for If");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002156 return NULL;
2157 }
Victor Stinner8370e072021-03-24 02:23:01 +01002158 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002159 if (!p)
2160 return NULL;
2161 p->kind = If_kind;
2162 p->v.If.test = test;
2163 p->v.If.body = body;
2164 p->v.If.orelse = orelse;
2165 p->lineno = lineno;
2166 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002167 p->end_lineno = end_lineno;
2168 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002169 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170}
2171
2172stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002173_Py_With(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment,
2174 int lineno, int col_offset, int end_lineno, int end_col_offset,
2175 PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002176{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002177 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002178 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002179 if (!p)
2180 return NULL;
2181 p->kind = With_kind;
2182 p->v.With.items = items;
2183 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002184 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002185 p->lineno = lineno;
2186 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002187 p->end_lineno = end_lineno;
2188 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002189 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002190}
2191
2192stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002193_Py_AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, string
2194 type_comment, int lineno, int col_offset, int end_lineno, int
2195 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002196{
2197 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002198 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Yury Selivanov75445082015-05-11 22:57:16 -04002199 if (!p)
2200 return NULL;
2201 p->kind = AsyncWith_kind;
2202 p->v.AsyncWith.items = items;
2203 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002204 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002205 p->lineno = lineno;
2206 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002207 p->end_lineno = end_lineno;
2208 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002209 return p;
2210}
2211
2212stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002213_Py_Match(expr_ty subject, asdl_match_case_seq * cases, int lineno, int
2214 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Brandt Bucher145bf262021-02-26 14:51:55 -08002215{
2216 stmt_ty p;
2217 if (!subject) {
2218 PyErr_SetString(PyExc_ValueError,
2219 "field 'subject' is required for Match");
2220 return NULL;
2221 }
Victor Stinner8370e072021-03-24 02:23:01 +01002222 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Brandt Bucher145bf262021-02-26 14:51:55 -08002223 if (!p)
2224 return NULL;
2225 p->kind = Match_kind;
2226 p->v.Match.subject = subject;
2227 p->v.Match.cases = cases;
2228 p->lineno = lineno;
2229 p->col_offset = col_offset;
2230 p->end_lineno = end_lineno;
2231 p->end_col_offset = end_col_offset;
2232 return p;
2233}
2234
2235stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002236_Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int
2237 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002238{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002239 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002240 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002241 if (!p)
2242 return NULL;
2243 p->kind = Raise_kind;
2244 p->v.Raise.exc = exc;
2245 p->v.Raise.cause = cause;
2246 p->lineno = lineno;
2247 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002248 p->end_lineno = end_lineno;
2249 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002250 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251}
2252
2253stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002254_Py_Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, asdl_stmt_seq
2255 * orelse, asdl_stmt_seq * finalbody, int lineno, int col_offset, int
2256 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002258 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002259 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002260 if (!p)
2261 return NULL;
2262 p->kind = Try_kind;
2263 p->v.Try.body = body;
2264 p->v.Try.handlers = handlers;
2265 p->v.Try.orelse = orelse;
2266 p->v.Try.finalbody = finalbody;
2267 p->lineno = lineno;
2268 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002269 p->end_lineno = end_lineno;
2270 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002271 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002272}
2273
2274stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002275_Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int
2276 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002278 stmt_ty p;
2279 if (!test) {
2280 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002281 "field 'test' is required for Assert");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002282 return NULL;
2283 }
Victor Stinner8370e072021-03-24 02:23:01 +01002284 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002285 if (!p)
2286 return NULL;
2287 p->kind = Assert_kind;
2288 p->v.Assert.test = test;
2289 p->v.Assert.msg = msg;
2290 p->lineno = lineno;
2291 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002292 p->end_lineno = end_lineno;
2293 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002294 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295}
2296
2297stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002298_Py_Import(asdl_alias_seq * names, int lineno, int col_offset, int end_lineno,
2299 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002301 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002302 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002303 if (!p)
2304 return NULL;
2305 p->kind = Import_kind;
2306 p->v.Import.names = names;
2307 p->lineno = lineno;
2308 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002309 p->end_lineno = end_lineno;
2310 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002311 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312}
2313
2314stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002315_Py_ImportFrom(identifier module, asdl_alias_seq * names, int level, int
2316 lineno, int col_offset, int end_lineno, int end_col_offset,
2317 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002319 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002320 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002321 if (!p)
2322 return NULL;
2323 p->kind = ImportFrom_kind;
2324 p->v.ImportFrom.module = module;
2325 p->v.ImportFrom.names = names;
2326 p->v.ImportFrom.level = level;
2327 p->lineno = lineno;
2328 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002329 p->end_lineno = end_lineno;
2330 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002331 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002332}
2333
2334stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002335_Py_Global(asdl_identifier_seq * names, int lineno, int col_offset, int
2336 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002338 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002339 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002340 if (!p)
2341 return NULL;
2342 p->kind = Global_kind;
2343 p->v.Global.names = names;
2344 p->lineno = lineno;
2345 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002346 p->end_lineno = end_lineno;
2347 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002348 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349}
2350
2351stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002352_Py_Nonlocal(asdl_identifier_seq * names, int lineno, int col_offset, int
2353 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00002354{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002355 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002356 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002357 if (!p)
2358 return NULL;
2359 p->kind = Nonlocal_kind;
2360 p->v.Nonlocal.names = names;
2361 p->lineno = lineno;
2362 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002363 p->end_lineno = end_lineno;
2364 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002365 return p;
Jeremy Hylton81e95022007-02-27 06:50:52 +00002366}
2367
2368stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002369_Py_Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
2370 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002372 stmt_ty p;
2373 if (!value) {
2374 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002375 "field 'value' is required for Expr");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002376 return NULL;
2377 }
Victor Stinner8370e072021-03-24 02:23:01 +01002378 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002379 if (!p)
2380 return NULL;
2381 p->kind = Expr_kind;
2382 p->v.Expr.value = value;
2383 p->lineno = lineno;
2384 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002385 p->end_lineno = end_lineno;
2386 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002387 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388}
2389
2390stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002391_Py_Pass(int lineno, int col_offset, int end_lineno, int end_col_offset,
2392 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002393{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002394 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002395 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002396 if (!p)
2397 return NULL;
2398 p->kind = Pass_kind;
2399 p->lineno = lineno;
2400 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002401 p->end_lineno = end_lineno;
2402 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002403 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404}
2405
2406stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002407_Py_Break(int lineno, int col_offset, int end_lineno, int end_col_offset,
2408 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002410 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002411 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002412 if (!p)
2413 return NULL;
2414 p->kind = Break_kind;
2415 p->lineno = lineno;
2416 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002417 p->end_lineno = end_lineno;
2418 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002419 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420}
2421
2422stmt_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002423_Py_Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
2424 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002425{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002426 stmt_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002427 p = (stmt_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002428 if (!p)
2429 return NULL;
2430 p->kind = Continue_kind;
2431 p->lineno = lineno;
2432 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002433 p->end_lineno = end_lineno;
2434 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002435 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436}
2437
2438expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002439_Py_BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int col_offset,
2440 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002442 expr_ty p;
2443 if (!op) {
2444 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002445 "field 'op' is required for BoolOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002446 return NULL;
2447 }
Victor Stinner8370e072021-03-24 02:23:01 +01002448 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002449 if (!p)
2450 return NULL;
2451 p->kind = BoolOp_kind;
2452 p->v.BoolOp.op = op;
2453 p->v.BoolOp.values = values;
2454 p->lineno = lineno;
2455 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002456 p->end_lineno = end_lineno;
2457 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002458 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002459}
2460
2461expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002462_Py_NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
2463 end_lineno, int end_col_offset, PyArena *arena)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002464{
2465 expr_ty p;
2466 if (!target) {
2467 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002468 "field 'target' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002469 return NULL;
2470 }
2471 if (!value) {
2472 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002473 "field 'value' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002474 return NULL;
2475 }
Victor Stinner8370e072021-03-24 02:23:01 +01002476 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002477 if (!p)
2478 return NULL;
2479 p->kind = NamedExpr_kind;
2480 p->v.NamedExpr.target = target;
2481 p->v.NamedExpr.value = value;
2482 p->lineno = lineno;
2483 p->col_offset = col_offset;
2484 p->end_lineno = end_lineno;
2485 p->end_col_offset = end_col_offset;
2486 return p;
2487}
2488
2489expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002490_Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int
2491 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002493 expr_ty p;
2494 if (!left) {
2495 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002496 "field 'left' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002497 return NULL;
2498 }
2499 if (!op) {
2500 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002501 "field 'op' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002502 return NULL;
2503 }
2504 if (!right) {
2505 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002506 "field 'right' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002507 return NULL;
2508 }
Victor Stinner8370e072021-03-24 02:23:01 +01002509 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002510 if (!p)
2511 return NULL;
2512 p->kind = BinOp_kind;
2513 p->v.BinOp.left = left;
2514 p->v.BinOp.op = op;
2515 p->v.BinOp.right = right;
2516 p->lineno = lineno;
2517 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002518 p->end_lineno = end_lineno;
2519 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002520 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521}
2522
2523expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002524_Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
2525 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002527 expr_ty p;
2528 if (!op) {
2529 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002530 "field 'op' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002531 return NULL;
2532 }
2533 if (!operand) {
2534 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002535 "field 'operand' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002536 return NULL;
2537 }
Victor Stinner8370e072021-03-24 02:23:01 +01002538 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002539 if (!p)
2540 return NULL;
2541 p->kind = UnaryOp_kind;
2542 p->v.UnaryOp.op = op;
2543 p->v.UnaryOp.operand = operand;
2544 p->lineno = lineno;
2545 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002546 p->end_lineno = end_lineno;
2547 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002548 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549}
2550
2551expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002552_Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
2553 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002555 expr_ty p;
2556 if (!args) {
2557 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002558 "field 'args' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002559 return NULL;
2560 }
2561 if (!body) {
2562 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002563 "field 'body' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002564 return NULL;
2565 }
Victor Stinner8370e072021-03-24 02:23:01 +01002566 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002567 if (!p)
2568 return NULL;
2569 p->kind = Lambda_kind;
2570 p->v.Lambda.args = args;
2571 p->v.Lambda.body = body;
2572 p->lineno = lineno;
2573 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002574 p->end_lineno = end_lineno;
2575 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002576 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577}
2578
2579expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002580_Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int
2581 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002582{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002583 expr_ty p;
2584 if (!test) {
2585 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002586 "field 'test' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002587 return NULL;
2588 }
2589 if (!body) {
2590 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002591 "field 'body' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002592 return NULL;
2593 }
2594 if (!orelse) {
2595 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002596 "field 'orelse' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002597 return NULL;
2598 }
Victor Stinner8370e072021-03-24 02:23:01 +01002599 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002600 if (!p)
2601 return NULL;
2602 p->kind = IfExp_kind;
2603 p->v.IfExp.test = test;
2604 p->v.IfExp.body = body;
2605 p->v.IfExp.orelse = orelse;
2606 p->lineno = lineno;
2607 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002608 p->end_lineno = end_lineno;
2609 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002610 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002611}
2612
2613expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002614_Py_Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, int
2615 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002616{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002617 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002618 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002619 if (!p)
2620 return NULL;
2621 p->kind = Dict_kind;
2622 p->v.Dict.keys = keys;
2623 p->v.Dict.values = values;
2624 p->lineno = lineno;
2625 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002626 p->end_lineno = end_lineno;
2627 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002628 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629}
2630
2631expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002632_Py_Set(asdl_expr_seq * elts, int lineno, int col_offset, int end_lineno, int
2633 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002634{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002635 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002636 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002637 if (!p)
2638 return NULL;
2639 p->kind = Set_kind;
2640 p->v.Set.elts = elts;
2641 p->lineno = lineno;
2642 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002643 p->end_lineno = end_lineno;
2644 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002645 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002646}
2647
2648expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002649_Py_ListComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2650 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002651{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002652 expr_ty p;
2653 if (!elt) {
2654 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002655 "field 'elt' is required for ListComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002656 return NULL;
2657 }
Victor Stinner8370e072021-03-24 02:23:01 +01002658 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002659 if (!p)
2660 return NULL;
2661 p->kind = ListComp_kind;
2662 p->v.ListComp.elt = elt;
2663 p->v.ListComp.generators = generators;
2664 p->lineno = lineno;
2665 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002666 p->end_lineno = end_lineno;
2667 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002668 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669}
2670
2671expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002672_Py_SetComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2673 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002674{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002675 expr_ty p;
2676 if (!elt) {
2677 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002678 "field 'elt' is required for SetComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002679 return NULL;
2680 }
Victor Stinner8370e072021-03-24 02:23:01 +01002681 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002682 if (!p)
2683 return NULL;
2684 p->kind = SetComp_kind;
2685 p->v.SetComp.elt = elt;
2686 p->v.SetComp.generators = generators;
2687 p->lineno = lineno;
2688 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002689 p->end_lineno = end_lineno;
2690 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002691 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002692}
2693
2694expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002695_Py_DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * generators,
2696 int lineno, int col_offset, int end_lineno, int end_col_offset,
2697 PyArena *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002698{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002699 expr_ty p;
2700 if (!key) {
2701 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002702 "field 'key' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002703 return NULL;
2704 }
2705 if (!value) {
2706 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002707 "field 'value' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002708 return NULL;
2709 }
Victor Stinner8370e072021-03-24 02:23:01 +01002710 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002711 if (!p)
2712 return NULL;
2713 p->kind = DictComp_kind;
2714 p->v.DictComp.key = key;
2715 p->v.DictComp.value = value;
2716 p->v.DictComp.generators = generators;
2717 p->lineno = lineno;
2718 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002719 p->end_lineno = end_lineno;
2720 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002721 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002722}
2723
2724expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002725_Py_GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, int lineno,
2726 int col_offset, int end_lineno, int end_col_offset, PyArena
2727 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002729 expr_ty p;
2730 if (!elt) {
2731 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002732 "field 'elt' is required for GeneratorExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002733 return NULL;
2734 }
Victor Stinner8370e072021-03-24 02:23:01 +01002735 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002736 if (!p)
2737 return NULL;
2738 p->kind = GeneratorExp_kind;
2739 p->v.GeneratorExp.elt = elt;
2740 p->v.GeneratorExp.generators = generators;
2741 p->lineno = lineno;
2742 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002743 p->end_lineno = end_lineno;
2744 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002745 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746}
2747
2748expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002749_Py_Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2750 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002751{
2752 expr_ty p;
2753 if (!value) {
2754 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002755 "field 'value' is required for Await");
Yury Selivanov75445082015-05-11 22:57:16 -04002756 return NULL;
2757 }
Victor Stinner8370e072021-03-24 02:23:01 +01002758 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Yury Selivanov75445082015-05-11 22:57:16 -04002759 if (!p)
2760 return NULL;
2761 p->kind = Await_kind;
2762 p->v.Await.value = value;
2763 p->lineno = lineno;
2764 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002765 p->end_lineno = end_lineno;
2766 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002767 return p;
2768}
2769
2770expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002771_Py_Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2772 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002773{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002774 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002775 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002776 if (!p)
2777 return NULL;
2778 p->kind = Yield_kind;
2779 p->v.Yield.value = value;
2780 p->lineno = lineno;
2781 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002782 p->end_lineno = end_lineno;
2783 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002784 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785}
2786
2787expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002788_Py_YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2789 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002790{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002791 expr_ty p;
2792 if (!value) {
2793 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002794 "field 'value' is required for YieldFrom");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002795 return NULL;
2796 }
Victor Stinner8370e072021-03-24 02:23:01 +01002797 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002798 if (!p)
2799 return NULL;
2800 p->kind = YieldFrom_kind;
2801 p->v.YieldFrom.value = value;
2802 p->lineno = lineno;
2803 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002804 p->end_lineno = end_lineno;
2805 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002806 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002807}
2808
2809expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002810_Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * comparators, int
2811 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2812 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002813{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002814 expr_ty p;
2815 if (!left) {
2816 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002817 "field 'left' is required for Compare");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002818 return NULL;
2819 }
Victor Stinner8370e072021-03-24 02:23:01 +01002820 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002821 if (!p)
2822 return NULL;
2823 p->kind = Compare_kind;
2824 p->v.Compare.left = left;
2825 p->v.Compare.ops = ops;
2826 p->v.Compare.comparators = comparators;
2827 p->lineno = lineno;
2828 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002829 p->end_lineno = end_lineno;
2830 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002831 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002832}
2833
2834expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002835_Py_Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * keywords, int
2836 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2837 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002839 expr_ty p;
2840 if (!func) {
2841 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002842 "field 'func' is required for Call");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002843 return NULL;
2844 }
Victor Stinner8370e072021-03-24 02:23:01 +01002845 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002846 if (!p)
2847 return NULL;
2848 p->kind = Call_kind;
2849 p->v.Call.func = func;
2850 p->v.Call.args = args;
2851 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002852 p->lineno = lineno;
2853 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002854 p->end_lineno = end_lineno;
2855 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002856 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002857}
2858
2859expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002860_Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int
2861 lineno, int col_offset, int end_lineno, int end_col_offset,
2862 PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002863{
2864 expr_ty p;
2865 if (!value) {
2866 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002867 "field 'value' is required for FormattedValue");
Eric V. Smith235a6f02015-09-19 14:51:32 -04002868 return NULL;
2869 }
Victor Stinner8370e072021-03-24 02:23:01 +01002870 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Eric V. Smith235a6f02015-09-19 14:51:32 -04002871 if (!p)
2872 return NULL;
2873 p->kind = FormattedValue_kind;
2874 p->v.FormattedValue.value = value;
2875 p->v.FormattedValue.conversion = conversion;
2876 p->v.FormattedValue.format_spec = format_spec;
2877 p->lineno = lineno;
2878 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002879 p->end_lineno = end_lineno;
2880 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002881 return p;
2882}
2883
2884expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002885_Py_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int
2886 end_lineno, int end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04002887{
2888 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01002889 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Eric V. Smith235a6f02015-09-19 14:51:32 -04002890 if (!p)
2891 return NULL;
2892 p->kind = JoinedStr_kind;
2893 p->v.JoinedStr.values = values;
2894 p->lineno = lineno;
2895 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002896 p->end_lineno = end_lineno;
2897 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04002898 return p;
2899}
2900
2901expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002902_Py_Constant(constant value, string kind, int lineno, int col_offset, int
2903 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002904{
2905 expr_ty p;
2906 if (!value) {
2907 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002908 "field 'value' is required for Constant");
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002909 return NULL;
2910 }
Victor Stinner8370e072021-03-24 02:23:01 +01002911 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002912 if (!p)
2913 return NULL;
2914 p->kind = Constant_kind;
2915 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07002916 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002917 p->lineno = lineno;
2918 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002919 p->end_lineno = end_lineno;
2920 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002921 return p;
2922}
2923
2924expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002925_Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno,
2926 int col_offset, int end_lineno, int end_col_offset, PyArena
2927 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002929 expr_ty p;
2930 if (!value) {
2931 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002932 "field 'value' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002933 return NULL;
2934 }
2935 if (!attr) {
2936 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002937 "field 'attr' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002938 return NULL;
2939 }
2940 if (!ctx) {
2941 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002942 "field 'ctx' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002943 return NULL;
2944 }
Victor Stinner8370e072021-03-24 02:23:01 +01002945 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002946 if (!p)
2947 return NULL;
2948 p->kind = Attribute_kind;
2949 p->v.Attribute.value = value;
2950 p->v.Attribute.attr = attr;
2951 p->v.Attribute.ctx = ctx;
2952 p->lineno = lineno;
2953 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002954 p->end_lineno = end_lineno;
2955 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002956 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957}
2958
2959expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002960_Py_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno,
2961 int col_offset, int end_lineno, int end_col_offset, PyArena
2962 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002963{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002964 expr_ty p;
2965 if (!value) {
2966 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002967 "field 'value' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002968 return NULL;
2969 }
2970 if (!slice) {
2971 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002972 "field 'slice' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002973 return NULL;
2974 }
2975 if (!ctx) {
2976 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002977 "field 'ctx' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002978 return NULL;
2979 }
Victor Stinner8370e072021-03-24 02:23:01 +01002980 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002981 if (!p)
2982 return NULL;
2983 p->kind = Subscript_kind;
2984 p->v.Subscript.value = value;
2985 p->v.Subscript.slice = slice;
2986 p->v.Subscript.ctx = ctx;
2987 p->lineno = lineno;
2988 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002989 p->end_lineno = end_lineno;
2990 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002991 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992}
2993
2994expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02002995_Py_Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
2996 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00002997{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002998 expr_ty p;
2999 if (!value) {
3000 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003001 "field 'value' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003002 return NULL;
3003 }
3004 if (!ctx) {
3005 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003006 "field 'ctx' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003007 return NULL;
3008 }
Victor Stinner8370e072021-03-24 02:23:01 +01003009 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003010 if (!p)
3011 return NULL;
3012 p->kind = Starred_kind;
3013 p->v.Starred.value = value;
3014 p->v.Starred.ctx = ctx;
3015 p->lineno = lineno;
3016 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003017 p->end_lineno = end_lineno;
3018 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003019 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00003020}
3021
3022expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003023_Py_Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
3024 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003026 expr_ty p;
3027 if (!id) {
3028 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003029 "field 'id' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003030 return NULL;
3031 }
3032 if (!ctx) {
3033 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003034 "field 'ctx' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003035 return NULL;
3036 }
Victor Stinner8370e072021-03-24 02:23:01 +01003037 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003038 if (!p)
3039 return NULL;
3040 p->kind = Name_kind;
3041 p->v.Name.id = id;
3042 p->v.Name.ctx = ctx;
3043 p->lineno = lineno;
3044 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003045 p->end_lineno = end_lineno;
3046 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003047 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048}
3049
3050expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003051_Py_List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset,
3052 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003054 expr_ty p;
3055 if (!ctx) {
3056 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003057 "field 'ctx' is required for List");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003058 return NULL;
3059 }
Victor Stinner8370e072021-03-24 02:23:01 +01003060 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003061 if (!p)
3062 return NULL;
3063 p->kind = List_kind;
3064 p->v.List.elts = elts;
3065 p->v.List.ctx = ctx;
3066 p->lineno = lineno;
3067 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003068 p->end_lineno = end_lineno;
3069 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003070 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071}
3072
3073expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003074_Py_Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int
3075 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003076{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003077 expr_ty p;
3078 if (!ctx) {
3079 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003080 "field 'ctx' is required for Tuple");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003081 return NULL;
3082 }
Victor Stinner8370e072021-03-24 02:23:01 +01003083 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003084 if (!p)
3085 return NULL;
3086 p->kind = Tuple_kind;
3087 p->v.Tuple.elts = elts;
3088 p->v.Tuple.ctx = ctx;
3089 p->lineno = lineno;
3090 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003091 p->end_lineno = end_lineno;
3092 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003093 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094}
3095
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003096expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003097_Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int
3098 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003099{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003100 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01003101 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003102 if (!p)
3103 return NULL;
3104 p->kind = Slice_kind;
3105 p->v.Slice.lower = lower;
3106 p->v.Slice.upper = upper;
3107 p->v.Slice.step = step;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003108 p->lineno = lineno;
3109 p->col_offset = col_offset;
3110 p->end_lineno = end_lineno;
3111 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003112 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113}
3114
Brandt Bucher145bf262021-02-26 14:51:55 -08003115expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003116_Py_MatchAs(expr_ty pattern, identifier name, int lineno, int col_offset, int
3117 end_lineno, int end_col_offset, PyArena *arena)
Brandt Bucher145bf262021-02-26 14:51:55 -08003118{
3119 expr_ty p;
3120 if (!pattern) {
3121 PyErr_SetString(PyExc_ValueError,
3122 "field 'pattern' is required for MatchAs");
3123 return NULL;
3124 }
3125 if (!name) {
3126 PyErr_SetString(PyExc_ValueError,
3127 "field 'name' is required for MatchAs");
3128 return NULL;
3129 }
Victor Stinner8370e072021-03-24 02:23:01 +01003130 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Brandt Bucher145bf262021-02-26 14:51:55 -08003131 if (!p)
3132 return NULL;
3133 p->kind = MatchAs_kind;
3134 p->v.MatchAs.pattern = pattern;
3135 p->v.MatchAs.name = name;
3136 p->lineno = lineno;
3137 p->col_offset = col_offset;
3138 p->end_lineno = end_lineno;
3139 p->end_col_offset = end_col_offset;
3140 return p;
3141}
3142
3143expr_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003144_Py_MatchOr(asdl_expr_seq * patterns, int lineno, int col_offset, int
3145 end_lineno, int end_col_offset, PyArena *arena)
Brandt Bucher145bf262021-02-26 14:51:55 -08003146{
3147 expr_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01003148 p = (expr_ty)_PyArena_Malloc(arena, sizeof(*p));
Brandt Bucher145bf262021-02-26 14:51:55 -08003149 if (!p)
3150 return NULL;
3151 p->kind = MatchOr_kind;
3152 p->v.MatchOr.patterns = patterns;
3153 p->lineno = lineno;
3154 p->col_offset = col_offset;
3155 p->end_lineno = end_lineno;
3156 p->end_col_offset = end_col_offset;
3157 return p;
3158}
3159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160comprehension_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003161_Py_comprehension(expr_ty target, expr_ty iter, asdl_expr_seq * ifs, int
3162 is_async, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003163{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003164 comprehension_ty p;
3165 if (!target) {
3166 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003167 "field 'target' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003168 return NULL;
3169 }
3170 if (!iter) {
3171 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003172 "field 'iter' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003173 return NULL;
3174 }
Victor Stinner8370e072021-03-24 02:23:01 +01003175 p = (comprehension_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003176 if (!p)
3177 return NULL;
3178 p->target = target;
3179 p->iter = iter;
3180 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003181 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003182 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003183}
3184
3185excepthandler_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003186_Py_ExceptHandler(expr_ty type, identifier name, asdl_stmt_seq * body, int
3187 lineno, int col_offset, int end_lineno, int end_col_offset,
3188 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003190 excepthandler_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01003191 p = (excepthandler_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003192 if (!p)
3193 return NULL;
3194 p->kind = ExceptHandler_kind;
3195 p->v.ExceptHandler.type = type;
3196 p->v.ExceptHandler.name = name;
3197 p->v.ExceptHandler.body = body;
3198 p->lineno = lineno;
3199 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003200 p->end_lineno = end_lineno;
3201 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003202 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203}
3204
3205arguments_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003206_Py_arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, arg_ty vararg,
3207 asdl_arg_seq * kwonlyargs, asdl_expr_seq * kw_defaults, arg_ty
3208 kwarg, asdl_expr_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003210 arguments_ty p;
Victor Stinner8370e072021-03-24 02:23:01 +01003211 p = (arguments_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003212 if (!p)
3213 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003214 p->posonlyargs = posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003215 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003216 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003217 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003218 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003219 p->kwarg = kwarg;
3220 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003221 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222}
3223
Neal Norwitzc1505362006-12-28 06:47:50 +00003224arg_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003225_Py_arg(identifier arg, expr_ty annotation, string type_comment, int lineno,
3226 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00003227{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003228 arg_ty p;
3229 if (!arg) {
3230 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003231 "field 'arg' is required for arg");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003232 return NULL;
3233 }
Victor Stinner8370e072021-03-24 02:23:01 +01003234 p = (arg_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003235 if (!p)
3236 return NULL;
3237 p->arg = arg;
3238 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003239 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01003240 p->lineno = lineno;
3241 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003242 p->end_lineno = end_lineno;
3243 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003244 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00003245}
3246
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247keyword_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003248_Py_keyword(identifier arg, expr_ty value, int lineno, int col_offset, int
3249 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003251 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003252 if (!value) {
3253 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003254 "field 'value' is required for keyword");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003255 return NULL;
3256 }
Victor Stinner8370e072021-03-24 02:23:01 +01003257 p = (keyword_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003258 if (!p)
3259 return NULL;
3260 p->arg = arg;
3261 p->value = value;
Pablo Galindo168660b2020-04-02 00:47:39 +01003262 p->lineno = lineno;
3263 p->col_offset = col_offset;
3264 p->end_lineno = end_lineno;
3265 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003266 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267}
3268
3269alias_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003270_Py_alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003272 alias_ty p;
3273 if (!name) {
3274 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003275 "field 'name' is required for alias");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003276 return NULL;
3277 }
Victor Stinner8370e072021-03-24 02:23:01 +01003278 p = (alias_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003279 if (!p)
3280 return NULL;
3281 p->name = name;
3282 p->asname = asname;
3283 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003284}
3285
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003286withitem_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003287_Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003288{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003289 withitem_ty p;
3290 if (!context_expr) {
3291 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003292 "field 'context_expr' is required for withitem");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003293 return NULL;
3294 }
Victor Stinner8370e072021-03-24 02:23:01 +01003295 p = (withitem_ty)_PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003296 if (!p)
3297 return NULL;
3298 p->context_expr = context_expr;
3299 p->optional_vars = optional_vars;
3300 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003301}
3302
Brandt Bucher145bf262021-02-26 14:51:55 -08003303match_case_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003304_Py_match_case(expr_ty pattern, expr_ty guard, asdl_stmt_seq * body, PyArena
3305 *arena)
Brandt Bucher145bf262021-02-26 14:51:55 -08003306{
3307 match_case_ty p;
3308 if (!pattern) {
3309 PyErr_SetString(PyExc_ValueError,
3310 "field 'pattern' is required for match_case");
3311 return NULL;
3312 }
Victor Stinner8370e072021-03-24 02:23:01 +01003313 p = (match_case_ty)_PyArena_Malloc(arena, sizeof(*p));
Brandt Bucher145bf262021-02-26 14:51:55 -08003314 if (!p)
3315 return NULL;
3316 p->pattern = pattern;
3317 p->guard = guard;
3318 p->body = body;
3319 return p;
3320}
3321
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003322type_ignore_ty
Victor Stinnerd36d6a92021-04-07 13:01:09 +02003323_Py_TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003324{
3325 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003326 if (!tag) {
3327 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003328 "field 'tag' is required for TypeIgnore");
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003329 return NULL;
3330 }
Victor Stinner8370e072021-03-24 02:23:01 +01003331 p = (type_ignore_ty)_PyArena_Malloc(arena, sizeof(*p));
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003332 if (!p)
3333 return NULL;
3334 p->kind = TypeIgnore_kind;
3335 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003336 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003337 return p;
3338}
3339
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003340
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003341PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003342ast2obj_mod(struct ast_state *state, void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003343{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003344 mod_ty o = (mod_ty)_o;
3345 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003346 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003347 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003348 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003349 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003350 switch (o->kind) {
3351 case Module_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003352 tp = (PyTypeObject *)state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003353 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003354 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003355 value = ast2obj_list(state, (asdl_seq*)o->v.Module.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003356 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003357 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003358 goto failed;
3359 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003360 value = ast2obj_list(state, (asdl_seq*)o->v.Module.type_ignores,
Victor Stinner74419f02020-07-03 11:35:37 +02003361 ast2obj_type_ignore);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003362 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003363 if (PyObject_SetAttr(result, state->type_ignores, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003364 goto failed;
3365 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003366 break;
3367 case Interactive_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003368 tp = (PyTypeObject *)state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003369 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003370 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003371 value = ast2obj_list(state, (asdl_seq*)o->v.Interactive.body,
3372 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003373 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003374 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003375 goto failed;
3376 Py_DECREF(value);
3377 break;
3378 case Expression_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003379 tp = (PyTypeObject *)state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003380 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003381 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003382 value = ast2obj_expr(state, o->v.Expression.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003383 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003384 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003385 goto failed;
3386 Py_DECREF(value);
3387 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003388 case FunctionType_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003389 tp = (PyTypeObject *)state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003390 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003391 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003392 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionType.argtypes,
3393 ast2obj_expr);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003394 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003395 if (PyObject_SetAttr(result, state->argtypes, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003396 goto failed;
3397 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003398 value = ast2obj_expr(state, o->v.FunctionType.returns);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003399 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003400 if (PyObject_SetAttr(result, state->returns, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003401 goto failed;
3402 Py_DECREF(value);
3403 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003404 }
3405 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003406failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003407 Py_XDECREF(value);
3408 Py_XDECREF(result);
3409 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003410}
3411
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003412PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003413ast2obj_stmt(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003414{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003415 stmt_ty o = (stmt_ty)_o;
3416 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003417 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003418 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003419 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003420 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003421 switch (o->kind) {
3422 case FunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003423 tp = (PyTypeObject *)state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003424 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003425 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003426 value = ast2obj_identifier(state, o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003427 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003428 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003429 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003430 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003431 value = ast2obj_arguments(state, o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003432 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003433 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003434 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003435 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003436 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.body,
3437 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003438 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003439 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003440 goto failed;
3441 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003442 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.decorator_list,
Victor Stinner74419f02020-07-03 11:35:37 +02003443 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003444 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003445 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003446 goto failed;
3447 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003448 value = ast2obj_expr(state, o->v.FunctionDef.returns);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003449 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003450 if (PyObject_SetAttr(result, state->returns, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003451 goto failed;
3452 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003453 value = ast2obj_string(state, o->v.FunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003454 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003455 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003456 goto failed;
3457 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003458 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003459 case AsyncFunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003460 tp = (PyTypeObject *)state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003461 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003462 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003463 value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name);
Yury Selivanov75445082015-05-11 22:57:16 -04003464 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003465 if (PyObject_SetAttr(result, state->name, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003466 goto failed;
3467 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003468 value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
Yury Selivanov75445082015-05-11 22:57:16 -04003469 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003470 if (PyObject_SetAttr(result, state->args, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003471 goto failed;
3472 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003473 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFunctionDef.body,
3474 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003475 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003476 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003477 goto failed;
3478 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003479 value = ast2obj_list(state,
3480 (asdl_seq*)o->v.AsyncFunctionDef.decorator_list,
Yury Selivanov75445082015-05-11 22:57:16 -04003481 ast2obj_expr);
3482 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003483 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003484 goto failed;
3485 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003486 value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns);
Yury Selivanov75445082015-05-11 22:57:16 -04003487 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003488 if (PyObject_SetAttr(result, state->returns, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003489 goto failed;
3490 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003491 value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003492 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003493 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003494 goto failed;
3495 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003496 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003497 case ClassDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003498 tp = (PyTypeObject *)state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003499 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003500 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003501 value = ast2obj_identifier(state, o->v.ClassDef.name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003502 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003503 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003504 goto failed;
3505 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003506 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.bases,
3507 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003508 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003509 if (PyObject_SetAttr(result, state->bases, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003510 goto failed;
3511 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003512 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.keywords,
3513 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003514 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003515 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003516 goto failed;
3517 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003518 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.body,
3519 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003520 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003521 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003522 goto failed;
3523 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003524 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.decorator_list,
3525 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003526 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003527 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003528 goto failed;
3529 Py_DECREF(value);
3530 break;
3531 case Return_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003532 tp = (PyTypeObject *)state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003533 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003534 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003535 value = ast2obj_expr(state, o->v.Return.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003536 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003537 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003538 goto failed;
3539 Py_DECREF(value);
3540 break;
3541 case Delete_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003542 tp = (PyTypeObject *)state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003543 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003544 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003545 value = ast2obj_list(state, (asdl_seq*)o->v.Delete.targets,
3546 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003547 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003548 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003549 goto failed;
3550 Py_DECREF(value);
3551 break;
3552 case Assign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003553 tp = (PyTypeObject *)state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003554 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003555 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003556 value = ast2obj_list(state, (asdl_seq*)o->v.Assign.targets,
3557 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003558 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003559 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003560 goto failed;
3561 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003562 value = ast2obj_expr(state, o->v.Assign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003563 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003564 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003565 goto failed;
3566 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003567 value = ast2obj_string(state, o->v.Assign.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003568 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003569 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003570 goto failed;
3571 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003572 break;
3573 case AugAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003574 tp = (PyTypeObject *)state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003575 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003576 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003577 value = ast2obj_expr(state, o->v.AugAssign.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003578 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003579 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003580 goto failed;
3581 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003582 value = ast2obj_operator(state, o->v.AugAssign.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003583 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003584 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003585 goto failed;
3586 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003587 value = ast2obj_expr(state, o->v.AugAssign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003588 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003589 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003590 goto failed;
3591 Py_DECREF(value);
3592 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003593 case AnnAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003594 tp = (PyTypeObject *)state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003595 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003596 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003597 value = ast2obj_expr(state, o->v.AnnAssign.target);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003598 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003599 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003600 goto failed;
3601 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003602 value = ast2obj_expr(state, o->v.AnnAssign.annotation);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003603 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003604 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003605 goto failed;
3606 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003607 value = ast2obj_expr(state, o->v.AnnAssign.value);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003608 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003609 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003610 goto failed;
3611 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003612 value = ast2obj_int(state, o->v.AnnAssign.simple);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003613 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003614 if (PyObject_SetAttr(result, state->simple, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003615 goto failed;
3616 Py_DECREF(value);
3617 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003618 case For_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003619 tp = (PyTypeObject *)state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003620 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003621 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003622 value = ast2obj_expr(state, o->v.For.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003623 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003624 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003625 goto failed;
3626 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003627 value = ast2obj_expr(state, o->v.For.iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003628 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003629 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003630 goto failed;
3631 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003632 value = ast2obj_list(state, (asdl_seq*)o->v.For.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003633 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003634 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003635 goto failed;
3636 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003637 value = ast2obj_list(state, (asdl_seq*)o->v.For.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003638 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003639 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003640 goto failed;
3641 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003642 value = ast2obj_string(state, o->v.For.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003643 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003644 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003645 goto failed;
3646 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003648 case AsyncFor_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003649 tp = (PyTypeObject *)state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003650 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003651 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003652 value = ast2obj_expr(state, o->v.AsyncFor.target);
Yury Selivanov75445082015-05-11 22:57:16 -04003653 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003654 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003655 goto failed;
3656 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003657 value = ast2obj_expr(state, o->v.AsyncFor.iter);
Yury Selivanov75445082015-05-11 22:57:16 -04003658 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003659 if (PyObject_SetAttr(result, state->iter, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003660 goto failed;
3661 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003662 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.body,
3663 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003664 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003665 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003666 goto failed;
3667 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003668 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.orelse,
3669 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003670 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003671 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003672 goto failed;
3673 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003674 value = ast2obj_string(state, o->v.AsyncFor.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003675 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003676 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003677 goto failed;
3678 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003679 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003680 case While_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003681 tp = (PyTypeObject *)state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003682 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003683 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003684 value = ast2obj_expr(state, o->v.While.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003685 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003686 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003687 goto failed;
3688 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003689 value = ast2obj_list(state, (asdl_seq*)o->v.While.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003690 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003691 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003692 goto failed;
3693 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003694 value = ast2obj_list(state, (asdl_seq*)o->v.While.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003695 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003696 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003697 goto failed;
3698 Py_DECREF(value);
3699 break;
3700 case If_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003701 tp = (PyTypeObject *)state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003702 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003703 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003704 value = ast2obj_expr(state, o->v.If.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003705 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003706 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003707 goto failed;
3708 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003709 value = ast2obj_list(state, (asdl_seq*)o->v.If.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003710 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003711 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003712 goto failed;
3713 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003714 value = ast2obj_list(state, (asdl_seq*)o->v.If.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003715 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003716 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003717 goto failed;
3718 Py_DECREF(value);
3719 break;
3720 case With_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003721 tp = (PyTypeObject *)state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003722 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003723 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003724 value = ast2obj_list(state, (asdl_seq*)o->v.With.items,
3725 ast2obj_withitem);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003726 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003727 if (PyObject_SetAttr(result, state->items, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003728 goto failed;
3729 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003730 value = ast2obj_list(state, (asdl_seq*)o->v.With.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003731 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003732 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003733 goto failed;
3734 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003735 value = ast2obj_string(state, o->v.With.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003736 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003737 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003738 goto failed;
3739 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003740 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003741 case AsyncWith_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003742 tp = (PyTypeObject *)state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003743 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003744 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003745 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.items,
3746 ast2obj_withitem);
Yury Selivanov75445082015-05-11 22:57:16 -04003747 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003748 if (PyObject_SetAttr(result, state->items, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003749 goto failed;
3750 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003751 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.body,
3752 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003753 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003754 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003755 goto failed;
3756 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003757 value = ast2obj_string(state, o->v.AsyncWith.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003758 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003759 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003760 goto failed;
3761 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003762 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08003763 case Match_kind:
3764 tp = (PyTypeObject *)state->Match_type;
3765 result = PyType_GenericNew(tp, NULL, NULL);
3766 if (!result) goto failed;
3767 value = ast2obj_expr(state, o->v.Match.subject);
3768 if (!value) goto failed;
3769 if (PyObject_SetAttr(result, state->subject, value) == -1)
3770 goto failed;
3771 Py_DECREF(value);
3772 value = ast2obj_list(state, (asdl_seq*)o->v.Match.cases,
3773 ast2obj_match_case);
3774 if (!value) goto failed;
3775 if (PyObject_SetAttr(result, state->cases, value) == -1)
3776 goto failed;
3777 Py_DECREF(value);
3778 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003779 case Raise_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003780 tp = (PyTypeObject *)state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003781 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003782 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003783 value = ast2obj_expr(state, o->v.Raise.exc);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003784 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003785 if (PyObject_SetAttr(result, state->exc, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003786 goto failed;
3787 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003788 value = ast2obj_expr(state, o->v.Raise.cause);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003789 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003790 if (PyObject_SetAttr(result, state->cause, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003791 goto failed;
3792 Py_DECREF(value);
3793 break;
3794 case Try_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003795 tp = (PyTypeObject *)state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003796 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003797 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003798 value = ast2obj_list(state, (asdl_seq*)o->v.Try.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003799 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003800 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003801 goto failed;
3802 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003803 value = ast2obj_list(state, (asdl_seq*)o->v.Try.handlers,
3804 ast2obj_excepthandler);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003805 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003806 if (PyObject_SetAttr(result, state->handlers, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003807 goto failed;
3808 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003809 value = ast2obj_list(state, (asdl_seq*)o->v.Try.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003810 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003811 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003812 goto failed;
3813 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003814 value = ast2obj_list(state, (asdl_seq*)o->v.Try.finalbody,
3815 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003816 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003817 if (PyObject_SetAttr(result, state->finalbody, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003818 goto failed;
3819 Py_DECREF(value);
3820 break;
3821 case Assert_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003822 tp = (PyTypeObject *)state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003823 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003824 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003825 value = ast2obj_expr(state, o->v.Assert.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003826 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003827 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003828 goto failed;
3829 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003830 value = ast2obj_expr(state, o->v.Assert.msg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003831 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003832 if (PyObject_SetAttr(result, state->msg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003833 goto failed;
3834 Py_DECREF(value);
3835 break;
3836 case Import_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003837 tp = (PyTypeObject *)state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003838 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003839 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003840 value = ast2obj_list(state, (asdl_seq*)o->v.Import.names,
3841 ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003842 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003843 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003844 goto failed;
3845 Py_DECREF(value);
3846 break;
3847 case ImportFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003848 tp = (PyTypeObject *)state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003849 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003850 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003851 value = ast2obj_identifier(state, o->v.ImportFrom.module);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003852 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003853 if (PyObject_SetAttr(result, state->module, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003854 goto failed;
3855 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003856 value = ast2obj_list(state, (asdl_seq*)o->v.ImportFrom.names,
3857 ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003858 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003859 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003860 goto failed;
3861 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003862 value = ast2obj_int(state, o->v.ImportFrom.level);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003863 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003864 if (PyObject_SetAttr(result, state->level, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003865 goto failed;
3866 Py_DECREF(value);
3867 break;
3868 case Global_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003869 tp = (PyTypeObject *)state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003870 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003871 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003872 value = ast2obj_list(state, (asdl_seq*)o->v.Global.names,
3873 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003874 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003875 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003876 goto failed;
3877 Py_DECREF(value);
3878 break;
3879 case Nonlocal_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003880 tp = (PyTypeObject *)state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003881 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003882 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003883 value = ast2obj_list(state, (asdl_seq*)o->v.Nonlocal.names,
3884 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003885 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003886 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 goto failed;
3888 Py_DECREF(value);
3889 break;
3890 case Expr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003891 tp = (PyTypeObject *)state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003892 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003893 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003894 value = ast2obj_expr(state, o->v.Expr.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003895 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003896 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003897 goto failed;
3898 Py_DECREF(value);
3899 break;
3900 case Pass_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003901 tp = (PyTypeObject *)state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003902 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003903 if (!result) goto failed;
3904 break;
3905 case Break_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003906 tp = (PyTypeObject *)state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003907 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003908 if (!result) goto failed;
3909 break;
3910 case Continue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003911 tp = (PyTypeObject *)state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003912 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003913 if (!result) goto failed;
3914 break;
3915 }
Victor Stinner74419f02020-07-03 11:35:37 +02003916 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003917 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003918 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003919 goto failed;
3920 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003921 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003922 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003923 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003924 goto failed;
3925 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003926 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003927 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003928 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003929 goto failed;
3930 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003931 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003932 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003933 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003934 goto failed;
3935 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003936 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003937failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003938 Py_XDECREF(value);
3939 Py_XDECREF(result);
3940 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941}
3942
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003943PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003944ast2obj_expr(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003945{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003946 expr_ty o = (expr_ty)_o;
3947 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003948 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003949 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003950 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003951 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003952 switch (o->kind) {
3953 case BoolOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003954 tp = (PyTypeObject *)state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003955 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003957 value = ast2obj_boolop(state, o->v.BoolOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003958 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003959 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003960 goto failed;
3961 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003962 value = ast2obj_list(state, (asdl_seq*)o->v.BoolOp.values,
3963 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003964 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003965 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003966 goto failed;
3967 Py_DECREF(value);
3968 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003969 case NamedExpr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003970 tp = (PyTypeObject *)state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003971 result = PyType_GenericNew(tp, NULL, NULL);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003972 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003973 value = ast2obj_expr(state, o->v.NamedExpr.target);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003974 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003975 if (PyObject_SetAttr(result, state->target, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003976 goto failed;
3977 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003978 value = ast2obj_expr(state, o->v.NamedExpr.value);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003979 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003980 if (PyObject_SetAttr(result, state->value, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003981 goto failed;
3982 Py_DECREF(value);
3983 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003984 case BinOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003985 tp = (PyTypeObject *)state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003986 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003987 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003988 value = ast2obj_expr(state, o->v.BinOp.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003989 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003990 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003991 goto failed;
3992 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003993 value = ast2obj_operator(state, o->v.BinOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003994 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003995 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003996 goto failed;
3997 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003998 value = ast2obj_expr(state, o->v.BinOp.right);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003999 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004000 if (PyObject_SetAttr(result, state->right, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004001 goto failed;
4002 Py_DECREF(value);
4003 break;
4004 case UnaryOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004005 tp = (PyTypeObject *)state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004006 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004007 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004008 value = ast2obj_unaryop(state, o->v.UnaryOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004010 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004011 goto failed;
4012 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004013 value = ast2obj_expr(state, o->v.UnaryOp.operand);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004014 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004015 if (PyObject_SetAttr(result, state->operand, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004016 goto failed;
4017 Py_DECREF(value);
4018 break;
4019 case Lambda_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004020 tp = (PyTypeObject *)state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004021 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004022 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004023 value = ast2obj_arguments(state, o->v.Lambda.args);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004024 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004025 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004026 goto failed;
4027 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004028 value = ast2obj_expr(state, o->v.Lambda.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004029 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004030 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004031 goto failed;
4032 Py_DECREF(value);
4033 break;
4034 case IfExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004035 tp = (PyTypeObject *)state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004036 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004037 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004038 value = ast2obj_expr(state, o->v.IfExp.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004039 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004040 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004041 goto failed;
4042 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004043 value = ast2obj_expr(state, o->v.IfExp.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004044 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004045 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004046 goto failed;
4047 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004048 value = ast2obj_expr(state, o->v.IfExp.orelse);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004049 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004050 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004051 goto failed;
4052 Py_DECREF(value);
4053 break;
4054 case Dict_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004055 tp = (PyTypeObject *)state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004056 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004057 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004058 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.keys, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004059 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004060 if (PyObject_SetAttr(result, state->keys, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004061 goto failed;
4062 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004063 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004064 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004065 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004066 goto failed;
4067 Py_DECREF(value);
4068 break;
4069 case Set_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004070 tp = (PyTypeObject *)state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004071 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004072 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004073 value = ast2obj_list(state, (asdl_seq*)o->v.Set.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004074 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004075 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004076 goto failed;
4077 Py_DECREF(value);
4078 break;
4079 case ListComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004080 tp = (PyTypeObject *)state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004081 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004083 value = ast2obj_expr(state, o->v.ListComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004084 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004085 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004086 goto failed;
4087 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004088 value = ast2obj_list(state, (asdl_seq*)o->v.ListComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004089 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004090 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004091 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004092 goto failed;
4093 Py_DECREF(value);
4094 break;
4095 case SetComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004096 tp = (PyTypeObject *)state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004097 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004098 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004099 value = ast2obj_expr(state, o->v.SetComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004100 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004101 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004102 goto failed;
4103 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004104 value = ast2obj_list(state, (asdl_seq*)o->v.SetComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004105 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004106 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004107 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004108 goto failed;
4109 Py_DECREF(value);
4110 break;
4111 case DictComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004112 tp = (PyTypeObject *)state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004113 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004114 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004115 value = ast2obj_expr(state, o->v.DictComp.key);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004116 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004117 if (PyObject_SetAttr(result, state->key, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004118 goto failed;
4119 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004120 value = ast2obj_expr(state, o->v.DictComp.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004121 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004122 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004123 goto failed;
4124 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004125 value = ast2obj_list(state, (asdl_seq*)o->v.DictComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004126 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004127 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004128 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004129 goto failed;
4130 Py_DECREF(value);
4131 break;
4132 case GeneratorExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004133 tp = (PyTypeObject *)state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004134 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004135 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004136 value = ast2obj_expr(state, o->v.GeneratorExp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004137 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004138 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004139 goto failed;
4140 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004141 value = ast2obj_list(state, (asdl_seq*)o->v.GeneratorExp.generators,
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004142 ast2obj_comprehension);
4143 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004144 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004145 goto failed;
4146 Py_DECREF(value);
4147 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004148 case Await_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004149 tp = (PyTypeObject *)state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004150 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04004151 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004152 value = ast2obj_expr(state, o->v.Await.value);
Yury Selivanov75445082015-05-11 22:57:16 -04004153 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004154 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004155 goto failed;
4156 Py_DECREF(value);
4157 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004158 case Yield_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004159 tp = (PyTypeObject *)state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004160 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004161 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004162 value = ast2obj_expr(state, o->v.Yield.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004163 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004164 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004165 goto failed;
4166 Py_DECREF(value);
4167 break;
4168 case YieldFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004169 tp = (PyTypeObject *)state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004170 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004172 value = ast2obj_expr(state, o->v.YieldFrom.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004173 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004174 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004175 goto failed;
4176 Py_DECREF(value);
4177 break;
4178 case Compare_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004179 tp = (PyTypeObject *)state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004180 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004181 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004182 value = ast2obj_expr(state, o->v.Compare.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004183 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004184 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004185 goto failed;
4186 Py_DECREF(value);
4187 {
4188 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
4189 value = PyList_New(n);
4190 if (!value) goto failed;
4191 for(i = 0; i < n; i++)
Victor Stinner74419f02020-07-03 11:35:37 +02004192 PyList_SET_ITEM(value, i, ast2obj_cmpop(state, (cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004193 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00004194 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004195 if (PyObject_SetAttr(result, state->ops, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004196 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004197 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004198 value = ast2obj_list(state, (asdl_seq*)o->v.Compare.comparators,
4199 ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00004200 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004201 if (PyObject_SetAttr(result, state->comparators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004202 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004203 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004204 break;
4205 case Call_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004206 tp = (PyTypeObject *)state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004207 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004208 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004209 value = ast2obj_expr(state, o->v.Call.func);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004210 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004211 if (PyObject_SetAttr(result, state->func, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004212 goto failed;
4213 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004214 value = ast2obj_list(state, (asdl_seq*)o->v.Call.args, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004215 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004216 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004217 goto failed;
4218 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004219 value = ast2obj_list(state, (asdl_seq*)o->v.Call.keywords,
4220 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004221 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004222 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004223 goto failed;
4224 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004225 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004226 case FormattedValue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004227 tp = (PyTypeObject *)state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004228 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004229 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004230 value = ast2obj_expr(state, o->v.FormattedValue.value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004231 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004232 if (PyObject_SetAttr(result, state->value, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004233 goto failed;
4234 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004235 value = ast2obj_int(state, o->v.FormattedValue.conversion);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004236 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004237 if (PyObject_SetAttr(result, state->conversion, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004238 goto failed;
4239 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004240 value = ast2obj_expr(state, o->v.FormattedValue.format_spec);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004241 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004242 if (PyObject_SetAttr(result, state->format_spec, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004243 goto failed;
4244 Py_DECREF(value);
4245 break;
4246 case JoinedStr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004247 tp = (PyTypeObject *)state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004248 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004249 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004250 value = ast2obj_list(state, (asdl_seq*)o->v.JoinedStr.values,
4251 ast2obj_expr);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004252 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004253 if (PyObject_SetAttr(result, state->values, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004254 goto failed;
4255 Py_DECREF(value);
4256 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004257 case Constant_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004258 tp = (PyTypeObject *)state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004259 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004260 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004261 value = ast2obj_constant(state, o->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004262 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004263 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004264 goto failed;
4265 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004266 value = ast2obj_string(state, o->v.Constant.kind);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004267 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004268 if (PyObject_SetAttr(result, state->kind, value) == -1)
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004269 goto failed;
4270 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004271 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004272 case Attribute_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004273 tp = (PyTypeObject *)state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004274 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004275 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004276 value = ast2obj_expr(state, o->v.Attribute.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004277 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004278 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004279 goto failed;
4280 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004281 value = ast2obj_identifier(state, o->v.Attribute.attr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004282 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004283 if (PyObject_SetAttr(result, state->attr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004284 goto failed;
4285 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004286 value = ast2obj_expr_context(state, o->v.Attribute.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004287 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004288 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004289 goto failed;
4290 Py_DECREF(value);
4291 break;
4292 case Subscript_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004293 tp = (PyTypeObject *)state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004294 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004295 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004296 value = ast2obj_expr(state, o->v.Subscript.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004297 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004298 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004299 goto failed;
4300 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004301 value = ast2obj_expr(state, o->v.Subscript.slice);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004302 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004303 if (PyObject_SetAttr(result, state->slice, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004304 goto failed;
4305 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004306 value = ast2obj_expr_context(state, o->v.Subscript.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004307 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004308 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004309 goto failed;
4310 Py_DECREF(value);
4311 break;
4312 case Starred_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004313 tp = (PyTypeObject *)state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004314 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004315 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004316 value = ast2obj_expr(state, o->v.Starred.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004317 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004318 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004319 goto failed;
4320 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004321 value = ast2obj_expr_context(state, o->v.Starred.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004322 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004323 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004324 goto failed;
4325 Py_DECREF(value);
4326 break;
4327 case Name_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004328 tp = (PyTypeObject *)state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004329 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004330 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004331 value = ast2obj_identifier(state, o->v.Name.id);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004332 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004333 if (PyObject_SetAttr(result, state->id, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004334 goto failed;
4335 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004336 value = ast2obj_expr_context(state, o->v.Name.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004337 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004338 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004339 goto failed;
4340 Py_DECREF(value);
4341 break;
4342 case List_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004343 tp = (PyTypeObject *)state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004344 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004345 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004346 value = ast2obj_list(state, (asdl_seq*)o->v.List.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004347 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004348 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004349 goto failed;
4350 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004351 value = ast2obj_expr_context(state, o->v.List.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004352 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004353 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004354 goto failed;
4355 Py_DECREF(value);
4356 break;
4357 case Tuple_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004358 tp = (PyTypeObject *)state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004359 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004360 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004361 value = ast2obj_list(state, (asdl_seq*)o->v.Tuple.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004362 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004363 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004364 goto failed;
4365 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004366 value = ast2obj_expr_context(state, o->v.Tuple.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004367 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004368 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004369 goto failed;
4370 Py_DECREF(value);
4371 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004372 case Slice_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004373 tp = (PyTypeObject *)state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004374 result = PyType_GenericNew(tp, NULL, NULL);
4375 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004376 value = ast2obj_expr(state, o->v.Slice.lower);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004377 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004378 if (PyObject_SetAttr(result, state->lower, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004379 goto failed;
4380 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004381 value = ast2obj_expr(state, o->v.Slice.upper);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004382 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004383 if (PyObject_SetAttr(result, state->upper, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004384 goto failed;
4385 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004386 value = ast2obj_expr(state, o->v.Slice.step);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004387 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004388 if (PyObject_SetAttr(result, state->step, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004389 goto failed;
4390 Py_DECREF(value);
4391 break;
Brandt Bucher145bf262021-02-26 14:51:55 -08004392 case MatchAs_kind:
4393 tp = (PyTypeObject *)state->MatchAs_type;
4394 result = PyType_GenericNew(tp, NULL, NULL);
4395 if (!result) goto failed;
4396 value = ast2obj_expr(state, o->v.MatchAs.pattern);
4397 if (!value) goto failed;
4398 if (PyObject_SetAttr(result, state->pattern, value) == -1)
4399 goto failed;
4400 Py_DECREF(value);
4401 value = ast2obj_identifier(state, o->v.MatchAs.name);
4402 if (!value) goto failed;
4403 if (PyObject_SetAttr(result, state->name, value) == -1)
4404 goto failed;
4405 Py_DECREF(value);
4406 break;
4407 case MatchOr_kind:
4408 tp = (PyTypeObject *)state->MatchOr_type;
4409 result = PyType_GenericNew(tp, NULL, NULL);
4410 if (!result) goto failed;
4411 value = ast2obj_list(state, (asdl_seq*)o->v.MatchOr.patterns,
4412 ast2obj_expr);
4413 if (!value) goto failed;
4414 if (PyObject_SetAttr(result, state->patterns, value) == -1)
4415 goto failed;
4416 Py_DECREF(value);
4417 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004418 }
Victor Stinner74419f02020-07-03 11:35:37 +02004419 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004420 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004421 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004422 goto failed;
4423 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004424 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004426 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004427 goto failed;
4428 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004429 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004430 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004431 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004432 goto failed;
4433 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004434 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004435 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004436 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004437 goto failed;
4438 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004439 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004440failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004441 Py_XDECREF(value);
4442 Py_XDECREF(result);
4443 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004444}
4445
Victor Stinner5cf47822020-11-02 22:03:28 +01004446PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004447{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004448 switch(o) {
4449 case Load:
Victor Stinner74419f02020-07-03 11:35:37 +02004450 Py_INCREF(state->Load_singleton);
4451 return state->Load_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004452 case Store:
Victor Stinner74419f02020-07-03 11:35:37 +02004453 Py_INCREF(state->Store_singleton);
4454 return state->Store_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004455 case Del:
Victor Stinner74419f02020-07-03 11:35:37 +02004456 Py_INCREF(state->Del_singleton);
4457 return state->Del_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004458 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004459 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004460}
Victor Stinner5cf47822020-11-02 22:03:28 +01004461PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004462{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004463 switch(o) {
4464 case And:
Victor Stinner74419f02020-07-03 11:35:37 +02004465 Py_INCREF(state->And_singleton);
4466 return state->And_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 case Or:
Victor Stinner74419f02020-07-03 11:35:37 +02004468 Py_INCREF(state->Or_singleton);
4469 return state->Or_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004470 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004471 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004472}
Victor Stinner5cf47822020-11-02 22:03:28 +01004473PyObject* ast2obj_operator(struct ast_state *state, operator_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004474{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004475 switch(o) {
4476 case Add:
Victor Stinner74419f02020-07-03 11:35:37 +02004477 Py_INCREF(state->Add_singleton);
4478 return state->Add_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004479 case Sub:
Victor Stinner74419f02020-07-03 11:35:37 +02004480 Py_INCREF(state->Sub_singleton);
4481 return state->Sub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004482 case Mult:
Victor Stinner74419f02020-07-03 11:35:37 +02004483 Py_INCREF(state->Mult_singleton);
4484 return state->Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04004485 case MatMult:
Victor Stinner74419f02020-07-03 11:35:37 +02004486 Py_INCREF(state->MatMult_singleton);
4487 return state->MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004488 case Div:
Victor Stinner74419f02020-07-03 11:35:37 +02004489 Py_INCREF(state->Div_singleton);
4490 return state->Div_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004491 case Mod:
Victor Stinner74419f02020-07-03 11:35:37 +02004492 Py_INCREF(state->Mod_singleton);
4493 return state->Mod_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004494 case Pow:
Victor Stinner74419f02020-07-03 11:35:37 +02004495 Py_INCREF(state->Pow_singleton);
4496 return state->Pow_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004497 case LShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004498 Py_INCREF(state->LShift_singleton);
4499 return state->LShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004500 case RShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004501 Py_INCREF(state->RShift_singleton);
4502 return state->RShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004503 case BitOr:
Victor Stinner74419f02020-07-03 11:35:37 +02004504 Py_INCREF(state->BitOr_singleton);
4505 return state->BitOr_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004506 case BitXor:
Victor Stinner74419f02020-07-03 11:35:37 +02004507 Py_INCREF(state->BitXor_singleton);
4508 return state->BitXor_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004509 case BitAnd:
Victor Stinner74419f02020-07-03 11:35:37 +02004510 Py_INCREF(state->BitAnd_singleton);
4511 return state->BitAnd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004512 case FloorDiv:
Victor Stinner74419f02020-07-03 11:35:37 +02004513 Py_INCREF(state->FloorDiv_singleton);
4514 return state->FloorDiv_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004515 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004516 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004517}
Victor Stinner5cf47822020-11-02 22:03:28 +01004518PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004519{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004520 switch(o) {
4521 case Invert:
Victor Stinner74419f02020-07-03 11:35:37 +02004522 Py_INCREF(state->Invert_singleton);
4523 return state->Invert_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004524 case Not:
Victor Stinner74419f02020-07-03 11:35:37 +02004525 Py_INCREF(state->Not_singleton);
4526 return state->Not_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 case UAdd:
Victor Stinner74419f02020-07-03 11:35:37 +02004528 Py_INCREF(state->UAdd_singleton);
4529 return state->UAdd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004530 case USub:
Victor Stinner74419f02020-07-03 11:35:37 +02004531 Py_INCREF(state->USub_singleton);
4532 return state->USub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004533 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004534 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004535}
Victor Stinner5cf47822020-11-02 22:03:28 +01004536PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004537{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004538 switch(o) {
4539 case Eq:
Victor Stinner74419f02020-07-03 11:35:37 +02004540 Py_INCREF(state->Eq_singleton);
4541 return state->Eq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004542 case NotEq:
Victor Stinner74419f02020-07-03 11:35:37 +02004543 Py_INCREF(state->NotEq_singleton);
4544 return state->NotEq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004545 case Lt:
Victor Stinner74419f02020-07-03 11:35:37 +02004546 Py_INCREF(state->Lt_singleton);
4547 return state->Lt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004548 case LtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004549 Py_INCREF(state->LtE_singleton);
4550 return state->LtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 case Gt:
Victor Stinner74419f02020-07-03 11:35:37 +02004552 Py_INCREF(state->Gt_singleton);
4553 return state->Gt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004554 case GtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004555 Py_INCREF(state->GtE_singleton);
4556 return state->GtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004557 case Is:
Victor Stinner74419f02020-07-03 11:35:37 +02004558 Py_INCREF(state->Is_singleton);
4559 return state->Is_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004560 case IsNot:
Victor Stinner74419f02020-07-03 11:35:37 +02004561 Py_INCREF(state->IsNot_singleton);
4562 return state->IsNot_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004563 case In:
Victor Stinner74419f02020-07-03 11:35:37 +02004564 Py_INCREF(state->In_singleton);
4565 return state->In_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004566 case NotIn:
Victor Stinner74419f02020-07-03 11:35:37 +02004567 Py_INCREF(state->NotIn_singleton);
4568 return state->NotIn_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004569 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004570 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004571}
4572PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004573ast2obj_comprehension(struct ast_state *state, void* _o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004574{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004575 comprehension_ty o = (comprehension_ty)_o;
4576 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004577 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004578 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004579 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004580 }
Victor Stinner74419f02020-07-03 11:35:37 +02004581 tp = (PyTypeObject *)state->comprehension_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004582 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004584 value = ast2obj_expr(state, o->target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004585 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004586 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004587 goto failed;
4588 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004589 value = ast2obj_expr(state, o->iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004590 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004591 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004592 goto failed;
4593 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004594 value = ast2obj_list(state, (asdl_seq*)o->ifs, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004595 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004596 if (PyObject_SetAttr(result, state->ifs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004597 goto failed;
4598 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004599 value = ast2obj_int(state, o->is_async);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004600 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004601 if (PyObject_SetAttr(result, state->is_async, value) == -1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004602 goto failed;
4603 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004604 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004605failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004606 Py_XDECREF(value);
4607 Py_XDECREF(result);
4608 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004609}
4610
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004611PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004612ast2obj_excepthandler(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004613{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004614 excepthandler_ty o = (excepthandler_ty)_o;
4615 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004616 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004617 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004618 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004619 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004620 switch (o->kind) {
4621 case ExceptHandler_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004622 tp = (PyTypeObject *)state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004623 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004624 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004625 value = ast2obj_expr(state, o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004626 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004627 if (PyObject_SetAttr(result, state->type, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004628 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004629 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004630 value = ast2obj_identifier(state, o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004631 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004632 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004633 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004634 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004635 value = ast2obj_list(state, (asdl_seq*)o->v.ExceptHandler.body,
4636 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004637 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004638 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004639 goto failed;
4640 Py_DECREF(value);
4641 break;
4642 }
Victor Stinner74419f02020-07-03 11:35:37 +02004643 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004644 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004645 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004646 goto failed;
4647 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004648 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004649 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004650 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004651 goto failed;
4652 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004653 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004654 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004655 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004656 goto failed;
4657 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004658 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004659 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004660 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004661 goto failed;
4662 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004663 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004664failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004665 Py_XDECREF(value);
4666 Py_XDECREF(result);
4667 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004668}
4669
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004670PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004671ast2obj_arguments(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004672{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004673 arguments_ty o = (arguments_ty)_o;
4674 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004675 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004676 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004677 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004678 }
Victor Stinner74419f02020-07-03 11:35:37 +02004679 tp = (PyTypeObject *)state->arguments_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004680 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004681 if (!result) return NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004682 value = ast2obj_list(state, (asdl_seq*)o->posonlyargs, ast2obj_arg);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004683 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004684 if (PyObject_SetAttr(result, state->posonlyargs, value) == -1)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004685 goto failed;
4686 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004687 value = ast2obj_list(state, (asdl_seq*)o->args, ast2obj_arg);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004688 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004689 if (PyObject_SetAttr(result, state->args, value) == -1)
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004690 goto failed;
4691 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004692 value = ast2obj_arg(state, o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004693 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004694 if (PyObject_SetAttr(result, state->vararg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004695 goto failed;
4696 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004697 value = ast2obj_list(state, (asdl_seq*)o->kwonlyargs, ast2obj_arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004698 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004699 if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004700 goto failed;
4701 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004702 value = ast2obj_list(state, (asdl_seq*)o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004703 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004704 if (PyObject_SetAttr(result, state->kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004705 goto failed;
4706 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004707 value = ast2obj_arg(state, o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004708 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004709 if (PyObject_SetAttr(result, state->kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004710 goto failed;
4711 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004712 value = ast2obj_list(state, (asdl_seq*)o->defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004713 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004714 if (PyObject_SetAttr(result, state->defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004715 goto failed;
4716 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004717 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004718failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004719 Py_XDECREF(value);
4720 Py_XDECREF(result);
4721 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004722}
4723
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004724PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004725ast2obj_arg(struct ast_state *state, void* _o)
Neal Norwitzc1505362006-12-28 06:47:50 +00004726{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004727 arg_ty o = (arg_ty)_o;
4728 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004729 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004730 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004731 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004732 }
Victor Stinner74419f02020-07-03 11:35:37 +02004733 tp = (PyTypeObject *)state->arg_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004734 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004735 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004736 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004737 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004738 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004739 goto failed;
4740 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004741 value = ast2obj_expr(state, o->annotation);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004742 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004743 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004744 goto failed;
4745 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004746 value = ast2obj_string(state, o->type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004747 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004748 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004749 goto failed;
4750 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004751 value = ast2obj_int(state, o->lineno);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004752 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004753 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004754 goto failed;
4755 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004756 value = ast2obj_int(state, o->col_offset);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004757 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004758 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004759 goto failed;
4760 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004761 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004762 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004763 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004764 goto failed;
4765 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004766 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004767 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004768 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004769 goto failed;
4770 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004771 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004772failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004773 Py_XDECREF(value);
4774 Py_XDECREF(result);
4775 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004776}
4777
4778PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004779ast2obj_keyword(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004780{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004781 keyword_ty o = (keyword_ty)_o;
4782 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004783 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004784 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004785 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004786 }
Victor Stinner74419f02020-07-03 11:35:37 +02004787 tp = (PyTypeObject *)state->keyword_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004788 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004789 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004790 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004791 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004792 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004793 goto failed;
4794 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004795 value = ast2obj_expr(state, o->value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004796 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004797 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004798 goto failed;
4799 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004800 value = ast2obj_int(state, o->lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004801 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004802 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004803 goto failed;
4804 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004805 value = ast2obj_int(state, o->col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004806 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004807 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004808 goto failed;
4809 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004810 value = ast2obj_int(state, o->end_lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004811 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004812 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004813 goto failed;
4814 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004815 value = ast2obj_int(state, o->end_col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004816 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004817 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004818 goto failed;
4819 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004820 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004821failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004822 Py_XDECREF(value);
4823 Py_XDECREF(result);
4824 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004825}
4826
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004827PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004828ast2obj_alias(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004829{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004830 alias_ty o = (alias_ty)_o;
4831 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004832 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004833 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004834 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004835 }
Victor Stinner74419f02020-07-03 11:35:37 +02004836 tp = (PyTypeObject *)state->alias_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004837 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004839 value = ast2obj_identifier(state, o->name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004840 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004841 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004842 goto failed;
4843 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004844 value = ast2obj_identifier(state, o->asname);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004845 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004846 if (PyObject_SetAttr(result, state->asname, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004847 goto failed;
4848 Py_DECREF(value);
4849 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004850failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004851 Py_XDECREF(value);
4852 Py_XDECREF(result);
4853 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004854}
4855
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004856PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004857ast2obj_withitem(struct ast_state *state, void* _o)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004858{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004859 withitem_ty o = (withitem_ty)_o;
4860 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004861 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004862 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004863 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004864 }
Victor Stinner74419f02020-07-03 11:35:37 +02004865 tp = (PyTypeObject *)state->withitem_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004866 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004868 value = ast2obj_expr(state, o->context_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004869 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004870 if (PyObject_SetAttr(result, state->context_expr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004871 goto failed;
4872 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004873 value = ast2obj_expr(state, o->optional_vars);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004874 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004875 if (PyObject_SetAttr(result, state->optional_vars, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004876 goto failed;
4877 Py_DECREF(value);
4878 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004879failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 Py_XDECREF(value);
4881 Py_XDECREF(result);
4882 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004883}
4884
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004885PyObject*
Brandt Bucher145bf262021-02-26 14:51:55 -08004886ast2obj_match_case(struct ast_state *state, void* _o)
4887{
4888 match_case_ty o = (match_case_ty)_o;
4889 PyObject *result = NULL, *value = NULL;
4890 PyTypeObject *tp;
4891 if (!o) {
4892 Py_RETURN_NONE;
4893 }
4894 tp = (PyTypeObject *)state->match_case_type;
4895 result = PyType_GenericNew(tp, NULL, NULL);
4896 if (!result) return NULL;
4897 value = ast2obj_expr(state, o->pattern);
4898 if (!value) goto failed;
4899 if (PyObject_SetAttr(result, state->pattern, value) == -1)
4900 goto failed;
4901 Py_DECREF(value);
4902 value = ast2obj_expr(state, o->guard);
4903 if (!value) goto failed;
4904 if (PyObject_SetAttr(result, state->guard, value) == -1)
4905 goto failed;
4906 Py_DECREF(value);
4907 value = ast2obj_list(state, (asdl_seq*)o->body, ast2obj_stmt);
4908 if (!value) goto failed;
4909 if (PyObject_SetAttr(result, state->body, value) == -1)
4910 goto failed;
4911 Py_DECREF(value);
4912 return result;
4913failed:
4914 Py_XDECREF(value);
4915 Py_XDECREF(result);
4916 return NULL;
4917}
4918
4919PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004920ast2obj_type_ignore(struct ast_state *state, void* _o)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004921{
4922 type_ignore_ty o = (type_ignore_ty)_o;
4923 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004924 PyTypeObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004925 if (!o) {
4926 Py_RETURN_NONE;
4927 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004928 switch (o->kind) {
4929 case TypeIgnore_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004930 tp = (PyTypeObject *)state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004931 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004932 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004933 value = ast2obj_int(state, o->v.TypeIgnore.lineno);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004934 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004935 if (PyObject_SetAttr(result, state->lineno, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004936 goto failed;
4937 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004938 value = ast2obj_string(state, o->v.TypeIgnore.tag);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07004939 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004940 if (PyObject_SetAttr(result, state->tag, value) == -1)
Michael J. Sullivan933e1502019-05-22 07:54:20 -07004941 goto failed;
4942 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004943 break;
4944 }
4945 return result;
4946failed:
4947 Py_XDECREF(value);
4948 Py_XDECREF(result);
4949 return NULL;
4950}
4951
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004952
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004953int
Victor Stinner5cf47822020-11-02 22:03:28 +01004954obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004955{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004956 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004957
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004958 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004959 PyObject *tp;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004960
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004961 if (obj == Py_None) {
4962 *out = NULL;
4963 return 0;
4964 }
Victor Stinner74419f02020-07-03 11:35:37 +02004965 tp = state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004966 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004967 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004968 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004969 }
4970 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01004971 asdl_stmt_seq* body;
4972 asdl_type_ignore_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004973
Victor Stinner74419f02020-07-03 11:35:37 +02004974 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004975 return 1;
4976 }
4977 if (tmp == NULL) {
4978 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4979 return 1;
4980 }
4981 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004982 int res;
4983 Py_ssize_t len;
4984 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004985 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07004986 PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004987 goto failed;
4988 }
4989 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004990 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004991 if (body == NULL) goto failed;
4992 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07004993 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03004994 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
4995 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02004996 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03004997 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004998 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03004999 if (len != PyList_GET_SIZE(tmp)) {
5000 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
5001 goto failed;
5002 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005003 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005004 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005005 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005006 }
Victor Stinner74419f02020-07-03 11:35:37 +02005007 if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005008 return 1;
5009 }
5010 if (tmp == NULL) {
5011 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
5012 return 1;
5013 }
5014 else {
5015 int res;
5016 Py_ssize_t len;
5017 Py_ssize_t i;
5018 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005019 PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005020 goto failed;
5021 }
5022 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005023 type_ignores = _Py_asdl_type_ignore_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005024 if (type_ignores == NULL) goto failed;
5025 for (i = 0; i < len; i++) {
5026 type_ignore_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005027 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5028 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005029 res = obj2ast_type_ignore(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005030 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005031 if (res != 0) goto failed;
5032 if (len != PyList_GET_SIZE(tmp)) {
5033 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
5034 goto failed;
5035 }
5036 asdl_seq_SET(type_ignores, i, val);
5037 }
5038 Py_CLEAR(tmp);
5039 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005040 *out = _Py_Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005041 if (*out == NULL) goto failed;
5042 return 0;
5043 }
Victor Stinner74419f02020-07-03 11:35:37 +02005044 tp = state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005045 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005046 if (isinstance == -1) {
5047 return 1;
5048 }
5049 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005050 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005051
Victor Stinner74419f02020-07-03 11:35:37 +02005052 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005053 return 1;
5054 }
5055 if (tmp == NULL) {
5056 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
5057 return 1;
5058 }
5059 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005060 int res;
5061 Py_ssize_t len;
5062 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005063 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005064 PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005065 goto failed;
5066 }
5067 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005068 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005069 if (body == NULL) goto failed;
5070 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005071 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005072 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5073 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005074 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005075 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005076 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005077 if (len != PyList_GET_SIZE(tmp)) {
5078 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
5079 goto failed;
5080 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005081 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005082 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005083 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005084 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005085 *out = _Py_Interactive(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005086 if (*out == NULL) goto failed;
5087 return 0;
5088 }
Victor Stinner74419f02020-07-03 11:35:37 +02005089 tp = state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005090 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005091 if (isinstance == -1) {
5092 return 1;
5093 }
5094 if (isinstance) {
5095 expr_ty body;
5096
Victor Stinner74419f02020-07-03 11:35:37 +02005097 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005098 return 1;
5099 }
5100 if (tmp == NULL) {
5101 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
5102 return 1;
5103 }
5104 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005105 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005106 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005107 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005108 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005109 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005110 *out = _Py_Expression(body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005111 if (*out == NULL) goto failed;
5112 return 0;
5113 }
Victor Stinner74419f02020-07-03 11:35:37 +02005114 tp = state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005115 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005116 if (isinstance == -1) {
5117 return 1;
5118 }
5119 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005120 asdl_expr_seq* argtypes;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005121 expr_ty returns;
5122
Victor Stinner74419f02020-07-03 11:35:37 +02005123 if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005124 return 1;
5125 }
5126 if (tmp == NULL) {
5127 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
5128 return 1;
5129 }
5130 else {
5131 int res;
5132 Py_ssize_t len;
5133 Py_ssize_t i;
5134 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005135 PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005136 goto failed;
5137 }
5138 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005139 argtypes = _Py_asdl_expr_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005140 if (argtypes == NULL) goto failed;
5141 for (i = 0; i < len; i++) {
5142 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005143 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5144 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005145 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005146 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005147 if (res != 0) goto failed;
5148 if (len != PyList_GET_SIZE(tmp)) {
5149 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
5150 goto failed;
5151 }
5152 asdl_seq_SET(argtypes, i, val);
5153 }
5154 Py_CLEAR(tmp);
5155 }
Victor Stinner74419f02020-07-03 11:35:37 +02005156 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005157 return 1;
5158 }
5159 if (tmp == NULL) {
5160 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
5161 return 1;
5162 }
5163 else {
5164 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005165 res = obj2ast_expr(state, tmp, &returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005166 if (res != 0) goto failed;
5167 Py_CLEAR(tmp);
5168 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005169 *out = _Py_FunctionType(argtypes, returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005170 if (*out == NULL) goto failed;
5171 return 0;
5172 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005173
5174 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
5175 failed:
5176 Py_XDECREF(tmp);
5177 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005178}
5179
5180int
Victor Stinner5cf47822020-11-02 22:03:28 +01005181obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
5182 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005183{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005184 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005185
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005186 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005187 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005188 int lineno;
5189 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005190 int end_lineno;
5191 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005192
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005193 if (obj == Py_None) {
5194 *out = NULL;
5195 return 0;
5196 }
Victor Stinner74419f02020-07-03 11:35:37 +02005197 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005198 return 1;
5199 }
5200 if (tmp == NULL) {
5201 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
5202 return 1;
5203 }
5204 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005205 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005206 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005207 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005208 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005209 }
Victor Stinner74419f02020-07-03 11:35:37 +02005210 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005211 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005212 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005213 if (tmp == NULL) {
5214 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
5215 return 1;
5216 }
5217 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005218 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005219 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005220 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005221 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005222 }
Victor Stinner74419f02020-07-03 11:35:37 +02005223 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005224 return 1;
5225 }
5226 if (tmp == NULL || tmp == Py_None) {
5227 Py_CLEAR(tmp);
5228 end_lineno = 0;
5229 }
5230 else {
5231 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005232 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005233 if (res != 0) goto failed;
5234 Py_CLEAR(tmp);
5235 }
Victor Stinner74419f02020-07-03 11:35:37 +02005236 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005237 return 1;
5238 }
5239 if (tmp == NULL || tmp == Py_None) {
5240 Py_CLEAR(tmp);
5241 end_col_offset = 0;
5242 }
5243 else {
5244 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005245 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005246 if (res != 0) goto failed;
5247 Py_CLEAR(tmp);
5248 }
Victor Stinner74419f02020-07-03 11:35:37 +02005249 tp = state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005250 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005251 if (isinstance == -1) {
5252 return 1;
5253 }
5254 if (isinstance) {
5255 identifier name;
5256 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005257 asdl_stmt_seq* body;
5258 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005259 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005260 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005261
Victor Stinner74419f02020-07-03 11:35:37 +02005262 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005263 return 1;
5264 }
5265 if (tmp == NULL) {
5266 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
5267 return 1;
5268 }
5269 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005270 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005271 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005272 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005273 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005274 }
Victor Stinner74419f02020-07-03 11:35:37 +02005275 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005276 return 1;
5277 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005278 if (tmp == NULL) {
5279 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
5280 return 1;
5281 }
5282 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005283 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005284 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005285 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005286 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005287 }
Victor Stinner74419f02020-07-03 11:35:37 +02005288 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005289 return 1;
5290 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005291 if (tmp == NULL) {
5292 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
5293 return 1;
5294 }
5295 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005296 int res;
5297 Py_ssize_t len;
5298 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005299 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005300 PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005301 goto failed;
5302 }
5303 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005304 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005305 if (body == NULL) goto failed;
5306 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005307 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005308 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5309 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005310 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005311 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005312 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005313 if (len != PyList_GET_SIZE(tmp)) {
5314 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
5315 goto failed;
5316 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005317 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005318 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005319 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005320 }
Victor Stinner74419f02020-07-03 11:35:37 +02005321 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005322 return 1;
5323 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005324 if (tmp == NULL) {
5325 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
5326 return 1;
5327 }
5328 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005329 int res;
5330 Py_ssize_t len;
5331 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005332 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005333 PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005334 goto failed;
5335 }
5336 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005337 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005338 if (decorator_list == NULL) goto failed;
5339 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005340 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005341 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5342 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005343 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005344 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005345 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005346 if (len != PyList_GET_SIZE(tmp)) {
5347 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
5348 goto failed;
5349 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005350 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005351 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005352 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005353 }
Victor Stinner74419f02020-07-03 11:35:37 +02005354 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005355 return 1;
5356 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005357 if (tmp == NULL || tmp == Py_None) {
5358 Py_CLEAR(tmp);
5359 returns = NULL;
5360 }
5361 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005362 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005363 res = obj2ast_expr(state, tmp, &returns, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005364 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005365 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005366 }
Victor Stinner74419f02020-07-03 11:35:37 +02005367 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005368 return 1;
5369 }
5370 if (tmp == NULL || tmp == Py_None) {
5371 Py_CLEAR(tmp);
5372 type_comment = NULL;
5373 }
5374 else {
5375 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005376 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005377 if (res != 0) goto failed;
5378 Py_CLEAR(tmp);
5379 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005380 *out = _Py_FunctionDef(name, args, body, decorator_list, returns,
5381 type_comment, lineno, col_offset, end_lineno,
5382 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005383 if (*out == NULL) goto failed;
5384 return 0;
5385 }
Victor Stinner74419f02020-07-03 11:35:37 +02005386 tp = state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005387 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04005388 if (isinstance == -1) {
5389 return 1;
5390 }
5391 if (isinstance) {
5392 identifier name;
5393 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005394 asdl_stmt_seq* body;
5395 asdl_expr_seq* decorator_list;
Yury Selivanov75445082015-05-11 22:57:16 -04005396 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005397 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005398
Victor Stinner74419f02020-07-03 11:35:37 +02005399 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005400 return 1;
5401 }
5402 if (tmp == NULL) {
5403 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
5404 return 1;
5405 }
5406 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005407 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005408 res = obj2ast_identifier(state, tmp, &name, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005409 if (res != 0) goto failed;
5410 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005411 }
Victor Stinner74419f02020-07-03 11:35:37 +02005412 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005413 return 1;
5414 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005415 if (tmp == NULL) {
5416 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
5417 return 1;
5418 }
5419 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005420 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005421 res = obj2ast_arguments(state, tmp, &args, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005422 if (res != 0) goto failed;
5423 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005424 }
Victor Stinner74419f02020-07-03 11:35:37 +02005425 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005426 return 1;
5427 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005428 if (tmp == NULL) {
5429 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
5430 return 1;
5431 }
5432 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005433 int res;
5434 Py_ssize_t len;
5435 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005436 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005437 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04005438 goto failed;
5439 }
5440 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005441 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005442 if (body == NULL) goto failed;
5443 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005444 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005445 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5446 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005447 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005448 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005449 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005450 if (len != PyList_GET_SIZE(tmp)) {
5451 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
5452 goto failed;
5453 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005454 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005455 }
5456 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005457 }
Victor Stinner74419f02020-07-03 11:35:37 +02005458 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005459 return 1;
5460 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005461 if (tmp == NULL) {
5462 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
5463 return 1;
5464 }
5465 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005466 int res;
5467 Py_ssize_t len;
5468 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005469 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005470 PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04005471 goto failed;
5472 }
5473 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005474 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005475 if (decorator_list == NULL) goto failed;
5476 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005477 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005478 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5479 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005480 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005481 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005482 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005483 if (len != PyList_GET_SIZE(tmp)) {
5484 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
5485 goto failed;
5486 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005487 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005488 }
5489 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005490 }
Victor Stinner74419f02020-07-03 11:35:37 +02005491 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005492 return 1;
5493 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005494 if (tmp == NULL || tmp == Py_None) {
5495 Py_CLEAR(tmp);
5496 returns = NULL;
5497 }
5498 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005499 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005500 res = obj2ast_expr(state, tmp, &returns, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005501 if (res != 0) goto failed;
5502 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005503 }
Victor Stinner74419f02020-07-03 11:35:37 +02005504 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005505 return 1;
5506 }
5507 if (tmp == NULL || tmp == Py_None) {
5508 Py_CLEAR(tmp);
5509 type_comment = NULL;
5510 }
5511 else {
5512 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005513 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005514 if (res != 0) goto failed;
5515 Py_CLEAR(tmp);
5516 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005517 *out = _Py_AsyncFunctionDef(name, args, body, decorator_list, returns,
5518 type_comment, lineno, col_offset,
5519 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005520 if (*out == NULL) goto failed;
5521 return 0;
5522 }
Victor Stinner74419f02020-07-03 11:35:37 +02005523 tp = state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005524 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005525 if (isinstance == -1) {
5526 return 1;
5527 }
5528 if (isinstance) {
5529 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005530 asdl_expr_seq* bases;
5531 asdl_keyword_seq* keywords;
5532 asdl_stmt_seq* body;
5533 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005534
Victor Stinner74419f02020-07-03 11:35:37 +02005535 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005536 return 1;
5537 }
5538 if (tmp == NULL) {
5539 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
5540 return 1;
5541 }
5542 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005543 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005544 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005545 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005546 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005547 }
Victor Stinner74419f02020-07-03 11:35:37 +02005548 if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005549 return 1;
5550 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005551 if (tmp == NULL) {
5552 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
5553 return 1;
5554 }
5555 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005556 int res;
5557 Py_ssize_t len;
5558 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005559 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005560 PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005561 goto failed;
5562 }
5563 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005564 bases = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005565 if (bases == NULL) goto failed;
5566 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005567 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005568 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5569 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005570 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005571 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005572 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005573 if (len != PyList_GET_SIZE(tmp)) {
5574 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
5575 goto failed;
5576 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005577 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005578 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005579 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005580 }
Victor Stinner74419f02020-07-03 11:35:37 +02005581 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005582 return 1;
5583 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005584 if (tmp == NULL) {
5585 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
5586 return 1;
5587 }
5588 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005589 int res;
5590 Py_ssize_t len;
5591 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005592 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005593 PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005594 goto failed;
5595 }
5596 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005597 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005598 if (keywords == NULL) goto failed;
5599 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005600 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005601 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5602 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005603 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005604 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005605 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005606 if (len != PyList_GET_SIZE(tmp)) {
5607 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
5608 goto failed;
5609 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005610 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005611 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005612 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005613 }
Victor Stinner74419f02020-07-03 11:35:37 +02005614 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005615 return 1;
5616 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005617 if (tmp == NULL) {
5618 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
5619 return 1;
5620 }
5621 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005622 int res;
5623 Py_ssize_t len;
5624 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005625 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005626 PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005627 goto failed;
5628 }
5629 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005630 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005631 if (body == NULL) goto failed;
5632 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005633 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005634 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5635 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005636 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005637 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005638 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005639 if (len != PyList_GET_SIZE(tmp)) {
5640 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
5641 goto failed;
5642 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005643 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005644 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005645 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005646 }
Victor Stinner74419f02020-07-03 11:35:37 +02005647 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005648 return 1;
5649 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005650 if (tmp == NULL) {
5651 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
5652 return 1;
5653 }
5654 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005655 int res;
5656 Py_ssize_t len;
5657 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005658 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005659 PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005660 goto failed;
5661 }
5662 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005663 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005664 if (decorator_list == NULL) goto failed;
5665 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005666 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005667 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5668 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005669 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005670 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005671 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005672 if (len != PyList_GET_SIZE(tmp)) {
5673 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
5674 goto failed;
5675 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005676 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005677 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005678 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005679 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005680 *out = _Py_ClassDef(name, bases, keywords, body, decorator_list,
5681 lineno, col_offset, end_lineno, end_col_offset,
5682 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005683 if (*out == NULL) goto failed;
5684 return 0;
5685 }
Victor Stinner74419f02020-07-03 11:35:37 +02005686 tp = state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005687 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005688 if (isinstance == -1) {
5689 return 1;
5690 }
5691 if (isinstance) {
5692 expr_ty value;
5693
Victor Stinner74419f02020-07-03 11:35:37 +02005694 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005695 return 1;
5696 }
5697 if (tmp == NULL || tmp == Py_None) {
5698 Py_CLEAR(tmp);
5699 value = NULL;
5700 }
5701 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005702 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005703 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005704 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005705 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005706 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005707 *out = _Py_Return(value, lineno, col_offset, end_lineno,
5708 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005709 if (*out == NULL) goto failed;
5710 return 0;
5711 }
Victor Stinner74419f02020-07-03 11:35:37 +02005712 tp = state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005713 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005714 if (isinstance == -1) {
5715 return 1;
5716 }
5717 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005718 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005719
Victor Stinner74419f02020-07-03 11:35:37 +02005720 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005721 return 1;
5722 }
5723 if (tmp == NULL) {
5724 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
5725 return 1;
5726 }
5727 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005728 int res;
5729 Py_ssize_t len;
5730 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005731 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005732 PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005733 goto failed;
5734 }
5735 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005736 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005737 if (targets == NULL) goto failed;
5738 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005739 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005740 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5741 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005742 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005743 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005744 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005745 if (len != PyList_GET_SIZE(tmp)) {
5746 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
5747 goto failed;
5748 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005749 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005750 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005751 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005752 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005753 *out = _Py_Delete(targets, lineno, col_offset, end_lineno,
5754 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005755 if (*out == NULL) goto failed;
5756 return 0;
5757 }
Victor Stinner74419f02020-07-03 11:35:37 +02005758 tp = state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005759 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005760 if (isinstance == -1) {
5761 return 1;
5762 }
5763 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005764 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005766 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005767
Victor Stinner74419f02020-07-03 11:35:37 +02005768 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005769 return 1;
5770 }
5771 if (tmp == NULL) {
5772 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
5773 return 1;
5774 }
5775 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005776 int res;
5777 Py_ssize_t len;
5778 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005779 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005780 PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005781 goto failed;
5782 }
5783 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005784 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005785 if (targets == NULL) goto failed;
5786 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005787 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005788 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5789 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005790 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005791 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005792 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005793 if (len != PyList_GET_SIZE(tmp)) {
5794 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
5795 goto failed;
5796 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005797 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005798 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005799 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005800 }
Victor Stinner74419f02020-07-03 11:35:37 +02005801 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005802 return 1;
5803 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005804 if (tmp == NULL) {
5805 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5806 return 1;
5807 }
5808 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005809 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005810 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005811 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005812 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005813 }
Victor Stinner74419f02020-07-03 11:35:37 +02005814 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005815 return 1;
5816 }
5817 if (tmp == NULL || tmp == Py_None) {
5818 Py_CLEAR(tmp);
5819 type_comment = NULL;
5820 }
5821 else {
5822 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005823 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005824 if (res != 0) goto failed;
5825 Py_CLEAR(tmp);
5826 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005827 *out = _Py_Assign(targets, value, type_comment, lineno, col_offset,
5828 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005829 if (*out == NULL) goto failed;
5830 return 0;
5831 }
Victor Stinner74419f02020-07-03 11:35:37 +02005832 tp = state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005833 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005834 if (isinstance == -1) {
5835 return 1;
5836 }
5837 if (isinstance) {
5838 expr_ty target;
5839 operator_ty op;
5840 expr_ty value;
5841
Victor Stinner74419f02020-07-03 11:35:37 +02005842 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005843 return 1;
5844 }
5845 if (tmp == NULL) {
5846 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5847 return 1;
5848 }
5849 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005850 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005851 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005852 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005853 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005854 }
Victor Stinner74419f02020-07-03 11:35:37 +02005855 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005856 return 1;
5857 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005858 if (tmp == NULL) {
5859 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5860 return 1;
5861 }
5862 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005863 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005864 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005865 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005866 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005867 }
Victor Stinner74419f02020-07-03 11:35:37 +02005868 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005869 return 1;
5870 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005871 if (tmp == NULL) {
5872 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
5873 return 1;
5874 }
5875 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005876 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005877 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005878 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005879 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005880 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005881 *out = _Py_AugAssign(target, op, value, lineno, col_offset, end_lineno,
5882 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005883 if (*out == NULL) goto failed;
5884 return 0;
5885 }
Victor Stinner74419f02020-07-03 11:35:37 +02005886 tp = state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005887 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005888 if (isinstance == -1) {
5889 return 1;
5890 }
5891 if (isinstance) {
5892 expr_ty target;
5893 expr_ty annotation;
5894 expr_ty value;
5895 int simple;
5896
Victor Stinner74419f02020-07-03 11:35:37 +02005897 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005898 return 1;
5899 }
5900 if (tmp == NULL) {
5901 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5902 return 1;
5903 }
5904 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005905 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005906 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005907 if (res != 0) goto failed;
5908 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005909 }
Victor Stinner74419f02020-07-03 11:35:37 +02005910 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005911 return 1;
5912 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005913 if (tmp == NULL) {
5914 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
5915 return 1;
5916 }
5917 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005918 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005919 res = obj2ast_expr(state, tmp, &annotation, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005920 if (res != 0) goto failed;
5921 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005922 }
Victor Stinner74419f02020-07-03 11:35:37 +02005923 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005924 return 1;
5925 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005926 if (tmp == NULL || tmp == Py_None) {
5927 Py_CLEAR(tmp);
5928 value = NULL;
5929 }
5930 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005931 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005932 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005933 if (res != 0) goto failed;
5934 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005935 }
Victor Stinner74419f02020-07-03 11:35:37 +02005936 if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005937 return 1;
5938 }
5939 if (tmp == NULL) {
5940 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5941 return 1;
5942 }
5943 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005944 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005945 res = obj2ast_int(state, tmp, &simple, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005946 if (res != 0) goto failed;
5947 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005948 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02005949 *out = _Py_AnnAssign(target, annotation, value, simple, lineno,
5950 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005951 if (*out == NULL) goto failed;
5952 return 0;
5953 }
Victor Stinner74419f02020-07-03 11:35:37 +02005954 tp = state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005955 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005956 if (isinstance == -1) {
5957 return 1;
5958 }
5959 if (isinstance) {
5960 expr_ty target;
5961 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005962 asdl_stmt_seq* body;
5963 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005964 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005965
Victor Stinner74419f02020-07-03 11:35:37 +02005966 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005967 return 1;
5968 }
5969 if (tmp == NULL) {
5970 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5971 return 1;
5972 }
5973 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005974 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005975 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005976 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005977 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005978 }
Victor Stinner74419f02020-07-03 11:35:37 +02005979 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005980 return 1;
5981 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005982 if (tmp == NULL) {
5983 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
5984 return 1;
5985 }
5986 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005987 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005988 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005989 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005990 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005991 }
Victor Stinner74419f02020-07-03 11:35:37 +02005992 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005993 return 1;
5994 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005995 if (tmp == NULL) {
5996 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
5997 return 1;
5998 }
5999 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006000 int res;
6001 Py_ssize_t len;
6002 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006003 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006004 PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006005 goto failed;
6006 }
6007 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006008 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006009 if (body == NULL) goto failed;
6010 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006011 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006012 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6013 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006014 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006015 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006016 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006017 if (len != PyList_GET_SIZE(tmp)) {
6018 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
6019 goto failed;
6020 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006021 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006022 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006023 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006024 }
Victor Stinner74419f02020-07-03 11:35:37 +02006025 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006026 return 1;
6027 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006028 if (tmp == NULL) {
6029 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
6030 return 1;
6031 }
6032 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006033 int res;
6034 Py_ssize_t len;
6035 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006036 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006037 PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006038 goto failed;
6039 }
6040 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006041 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006042 if (orelse == NULL) goto failed;
6043 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006044 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006045 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6046 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006047 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006048 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006049 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006050 if (len != PyList_GET_SIZE(tmp)) {
6051 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
6052 goto failed;
6053 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006054 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006055 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006056 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006057 }
Victor Stinner74419f02020-07-03 11:35:37 +02006058 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006059 return 1;
6060 }
6061 if (tmp == NULL || tmp == Py_None) {
6062 Py_CLEAR(tmp);
6063 type_comment = NULL;
6064 }
6065 else {
6066 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006067 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006068 if (res != 0) goto failed;
6069 Py_CLEAR(tmp);
6070 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006071 *out = _Py_For(target, iter, body, orelse, type_comment, lineno,
6072 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006073 if (*out == NULL) goto failed;
6074 return 0;
6075 }
Victor Stinner74419f02020-07-03 11:35:37 +02006076 tp = state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006077 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006078 if (isinstance == -1) {
6079 return 1;
6080 }
6081 if (isinstance) {
6082 expr_ty target;
6083 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006084 asdl_stmt_seq* body;
6085 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006086 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006087
Victor Stinner74419f02020-07-03 11:35:37 +02006088 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006089 return 1;
6090 }
6091 if (tmp == NULL) {
6092 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
6093 return 1;
6094 }
6095 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006096 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006097 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006098 if (res != 0) goto failed;
6099 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006100 }
Victor Stinner74419f02020-07-03 11:35:37 +02006101 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006102 return 1;
6103 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006104 if (tmp == NULL) {
6105 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
6106 return 1;
6107 }
6108 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006109 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006110 res = obj2ast_expr(state, tmp, &iter, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006111 if (res != 0) goto failed;
6112 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006113 }
Victor Stinner74419f02020-07-03 11:35:37 +02006114 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006115 return 1;
6116 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006117 if (tmp == NULL) {
6118 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
6119 return 1;
6120 }
6121 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006122 int res;
6123 Py_ssize_t len;
6124 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006125 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006126 PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04006127 goto failed;
6128 }
6129 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006130 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006131 if (body == NULL) goto failed;
6132 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006133 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006134 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6135 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006136 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006137 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006138 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006139 if (len != PyList_GET_SIZE(tmp)) {
6140 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
6141 goto failed;
6142 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006143 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006144 }
6145 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006146 }
Victor Stinner74419f02020-07-03 11:35:37 +02006147 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006148 return 1;
6149 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006150 if (tmp == NULL) {
6151 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
6152 return 1;
6153 }
6154 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006155 int res;
6156 Py_ssize_t len;
6157 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006158 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006159 PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04006160 goto failed;
6161 }
6162 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006163 orelse = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006164 if (orelse == NULL) goto failed;
6165 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006166 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006167 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6168 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006169 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006170 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006171 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006172 if (len != PyList_GET_SIZE(tmp)) {
6173 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
6174 goto failed;
6175 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006176 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006177 }
6178 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006179 }
Victor Stinner74419f02020-07-03 11:35:37 +02006180 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006181 return 1;
6182 }
6183 if (tmp == NULL || tmp == Py_None) {
6184 Py_CLEAR(tmp);
6185 type_comment = NULL;
6186 }
6187 else {
6188 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006189 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006190 if (res != 0) goto failed;
6191 Py_CLEAR(tmp);
6192 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006193 *out = _Py_AsyncFor(target, iter, body, orelse, type_comment, lineno,
6194 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006195 if (*out == NULL) goto failed;
6196 return 0;
6197 }
Victor Stinner74419f02020-07-03 11:35:37 +02006198 tp = state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006199 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006200 if (isinstance == -1) {
6201 return 1;
6202 }
6203 if (isinstance) {
6204 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006205 asdl_stmt_seq* body;
6206 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006207
Victor Stinner74419f02020-07-03 11:35:37 +02006208 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006209 return 1;
6210 }
6211 if (tmp == NULL) {
6212 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
6213 return 1;
6214 }
6215 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006216 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006217 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006218 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006219 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006220 }
Victor Stinner74419f02020-07-03 11:35:37 +02006221 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006222 return 1;
6223 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006224 if (tmp == NULL) {
6225 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
6226 return 1;
6227 }
6228 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006229 int res;
6230 Py_ssize_t len;
6231 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006232 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006233 PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006234 goto failed;
6235 }
6236 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006237 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006238 if (body == NULL) goto failed;
6239 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006240 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006241 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6242 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006243 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006244 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006245 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006246 if (len != PyList_GET_SIZE(tmp)) {
6247 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
6248 goto failed;
6249 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006250 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006251 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006252 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006253 }
Victor Stinner74419f02020-07-03 11:35:37 +02006254 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006255 return 1;
6256 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006257 if (tmp == NULL) {
6258 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
6259 return 1;
6260 }
6261 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006262 int res;
6263 Py_ssize_t len;
6264 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006265 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006266 PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006267 goto failed;
6268 }
6269 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006270 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006271 if (orelse == NULL) goto failed;
6272 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006273 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006274 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6275 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006276 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006277 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006278 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006279 if (len != PyList_GET_SIZE(tmp)) {
6280 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
6281 goto failed;
6282 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006283 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006284 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006285 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006286 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006287 *out = _Py_While(test, body, orelse, lineno, col_offset, end_lineno,
6288 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006289 if (*out == NULL) goto failed;
6290 return 0;
6291 }
Victor Stinner74419f02020-07-03 11:35:37 +02006292 tp = state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006293 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006294 if (isinstance == -1) {
6295 return 1;
6296 }
6297 if (isinstance) {
6298 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006299 asdl_stmt_seq* body;
6300 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006301
Victor Stinner74419f02020-07-03 11:35:37 +02006302 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006303 return 1;
6304 }
6305 if (tmp == NULL) {
6306 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
6307 return 1;
6308 }
6309 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006310 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006311 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006312 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006313 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006314 }
Victor Stinner74419f02020-07-03 11:35:37 +02006315 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006316 return 1;
6317 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006318 if (tmp == NULL) {
6319 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
6320 return 1;
6321 }
6322 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006323 int res;
6324 Py_ssize_t len;
6325 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006327 PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006328 goto failed;
6329 }
6330 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006331 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006332 if (body == NULL) goto failed;
6333 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006334 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006335 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6336 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006337 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006338 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006339 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006340 if (len != PyList_GET_SIZE(tmp)) {
6341 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
6342 goto failed;
6343 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006344 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006345 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006346 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006347 }
Victor Stinner74419f02020-07-03 11:35:37 +02006348 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006349 return 1;
6350 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006351 if (tmp == NULL) {
6352 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
6353 return 1;
6354 }
6355 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006356 int res;
6357 Py_ssize_t len;
6358 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006359 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006360 PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006361 goto failed;
6362 }
6363 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006364 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006365 if (orelse == NULL) goto failed;
6366 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006367 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006368 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6369 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006370 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006371 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006372 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006373 if (len != PyList_GET_SIZE(tmp)) {
6374 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
6375 goto failed;
6376 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006377 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006378 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006379 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006380 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006381 *out = _Py_If(test, body, orelse, lineno, col_offset, end_lineno,
6382 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006383 if (*out == NULL) goto failed;
6384 return 0;
6385 }
Victor Stinner74419f02020-07-03 11:35:37 +02006386 tp = state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006387 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006388 if (isinstance == -1) {
6389 return 1;
6390 }
6391 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006392 asdl_withitem_seq* items;
6393 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006394 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006395
Victor Stinner74419f02020-07-03 11:35:37 +02006396 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006397 return 1;
6398 }
6399 if (tmp == NULL) {
6400 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
6401 return 1;
6402 }
6403 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006404 int res;
6405 Py_ssize_t len;
6406 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006407 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006408 PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006409 goto failed;
6410 }
6411 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006412 items = _Py_asdl_withitem_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006413 if (items == NULL) goto failed;
6414 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006415 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006416 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6417 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006418 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006419 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006420 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006421 if (len != PyList_GET_SIZE(tmp)) {
6422 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
6423 goto failed;
6424 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006425 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006426 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006428 }
Victor Stinner74419f02020-07-03 11:35:37 +02006429 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006430 return 1;
6431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006432 if (tmp == NULL) {
6433 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
6434 return 1;
6435 }
6436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006437 int res;
6438 Py_ssize_t len;
6439 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006440 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006441 PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006442 goto failed;
6443 }
6444 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006445 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006446 if (body == NULL) goto failed;
6447 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006448 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006449 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6450 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006451 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006452 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006453 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006454 if (len != PyList_GET_SIZE(tmp)) {
6455 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
6456 goto failed;
6457 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006458 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006459 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006460 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006461 }
Victor Stinner74419f02020-07-03 11:35:37 +02006462 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006463 return 1;
6464 }
6465 if (tmp == NULL || tmp == Py_None) {
6466 Py_CLEAR(tmp);
6467 type_comment = NULL;
6468 }
6469 else {
6470 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006471 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006472 if (res != 0) goto failed;
6473 Py_CLEAR(tmp);
6474 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006475 *out = _Py_With(items, body, type_comment, lineno, col_offset,
6476 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006477 if (*out == NULL) goto failed;
6478 return 0;
6479 }
Victor Stinner74419f02020-07-03 11:35:37 +02006480 tp = state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006481 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006482 if (isinstance == -1) {
6483 return 1;
6484 }
6485 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006486 asdl_withitem_seq* items;
6487 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006488 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006489
Victor Stinner74419f02020-07-03 11:35:37 +02006490 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006491 return 1;
6492 }
6493 if (tmp == NULL) {
6494 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
6495 return 1;
6496 }
6497 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006498 int res;
6499 Py_ssize_t len;
6500 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006501 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006502 PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04006503 goto failed;
6504 }
6505 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006506 items = _Py_asdl_withitem_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006507 if (items == NULL) goto failed;
6508 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006509 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006510 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6511 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006512 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006513 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006514 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006515 if (len != PyList_GET_SIZE(tmp)) {
6516 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
6517 goto failed;
6518 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006519 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006520 }
6521 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006522 }
Victor Stinner74419f02020-07-03 11:35:37 +02006523 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006524 return 1;
6525 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006526 if (tmp == NULL) {
6527 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
6528 return 1;
6529 }
6530 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006531 int res;
6532 Py_ssize_t len;
6533 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006534 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006535 PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Yury Selivanov75445082015-05-11 22:57:16 -04006536 goto failed;
6537 }
6538 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006539 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006540 if (body == NULL) goto failed;
6541 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006542 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006543 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6544 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006545 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006546 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006547 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006548 if (len != PyList_GET_SIZE(tmp)) {
6549 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
6550 goto failed;
6551 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006552 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006553 }
6554 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006555 }
Victor Stinner74419f02020-07-03 11:35:37 +02006556 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006557 return 1;
6558 }
6559 if (tmp == NULL || tmp == Py_None) {
6560 Py_CLEAR(tmp);
6561 type_comment = NULL;
6562 }
6563 else {
6564 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006565 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006566 if (res != 0) goto failed;
6567 Py_CLEAR(tmp);
6568 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006569 *out = _Py_AsyncWith(items, body, type_comment, lineno, col_offset,
6570 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006571 if (*out == NULL) goto failed;
6572 return 0;
6573 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006574 tp = state->Match_type;
6575 isinstance = PyObject_IsInstance(obj, tp);
6576 if (isinstance == -1) {
6577 return 1;
6578 }
6579 if (isinstance) {
6580 expr_ty subject;
6581 asdl_match_case_seq* cases;
6582
6583 if (_PyObject_LookupAttr(obj, state->subject, &tmp) < 0) {
6584 return 1;
6585 }
6586 if (tmp == NULL) {
6587 PyErr_SetString(PyExc_TypeError, "required field \"subject\" missing from Match");
6588 return 1;
6589 }
6590 else {
6591 int res;
6592 res = obj2ast_expr(state, tmp, &subject, arena);
6593 if (res != 0) goto failed;
6594 Py_CLEAR(tmp);
6595 }
6596 if (_PyObject_LookupAttr(obj, state->cases, &tmp) < 0) {
6597 return 1;
6598 }
6599 if (tmp == NULL) {
6600 PyErr_SetString(PyExc_TypeError, "required field \"cases\" missing from Match");
6601 return 1;
6602 }
6603 else {
6604 int res;
6605 Py_ssize_t len;
6606 Py_ssize_t i;
6607 if (!PyList_Check(tmp)) {
6608 PyErr_Format(PyExc_TypeError, "Match field \"cases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
6609 goto failed;
6610 }
6611 len = PyList_GET_SIZE(tmp);
6612 cases = _Py_asdl_match_case_seq_new(len, arena);
6613 if (cases == NULL) goto failed;
6614 for (i = 0; i < len; i++) {
6615 match_case_ty val;
6616 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6617 Py_INCREF(tmp2);
6618 res = obj2ast_match_case(state, tmp2, &val, arena);
6619 Py_DECREF(tmp2);
6620 if (res != 0) goto failed;
6621 if (len != PyList_GET_SIZE(tmp)) {
6622 PyErr_SetString(PyExc_RuntimeError, "Match field \"cases\" changed size during iteration");
6623 goto failed;
6624 }
6625 asdl_seq_SET(cases, i, val);
6626 }
6627 Py_CLEAR(tmp);
6628 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006629 *out = _Py_Match(subject, cases, lineno, col_offset, end_lineno,
6630 end_col_offset, arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08006631 if (*out == NULL) goto failed;
6632 return 0;
6633 }
Victor Stinner74419f02020-07-03 11:35:37 +02006634 tp = state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006635 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006636 if (isinstance == -1) {
6637 return 1;
6638 }
6639 if (isinstance) {
6640 expr_ty exc;
6641 expr_ty cause;
6642
Victor Stinner74419f02020-07-03 11:35:37 +02006643 if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006644 return 1;
6645 }
6646 if (tmp == NULL || tmp == Py_None) {
6647 Py_CLEAR(tmp);
6648 exc = NULL;
6649 }
6650 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006651 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006652 res = obj2ast_expr(state, tmp, &exc, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006653 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006654 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006655 }
Victor Stinner74419f02020-07-03 11:35:37 +02006656 if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006657 return 1;
6658 }
6659 if (tmp == NULL || tmp == Py_None) {
6660 Py_CLEAR(tmp);
6661 cause = NULL;
6662 }
6663 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006664 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006665 res = obj2ast_expr(state, tmp, &cause, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006666 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006667 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006668 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006669 *out = _Py_Raise(exc, cause, lineno, col_offset, end_lineno,
6670 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006671 if (*out == NULL) goto failed;
6672 return 0;
6673 }
Victor Stinner74419f02020-07-03 11:35:37 +02006674 tp = state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006675 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006676 if (isinstance == -1) {
6677 return 1;
6678 }
6679 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006680 asdl_stmt_seq* body;
6681 asdl_excepthandler_seq* handlers;
6682 asdl_stmt_seq* orelse;
6683 asdl_stmt_seq* finalbody;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006684
Victor Stinner74419f02020-07-03 11:35:37 +02006685 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006686 return 1;
6687 }
6688 if (tmp == NULL) {
6689 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
6690 return 1;
6691 }
6692 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006693 int res;
6694 Py_ssize_t len;
6695 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006696 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006697 PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006698 goto failed;
6699 }
6700 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006701 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006702 if (body == NULL) goto failed;
6703 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006704 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006705 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6706 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006707 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006708 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006709 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006710 if (len != PyList_GET_SIZE(tmp)) {
6711 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
6712 goto failed;
6713 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006714 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006715 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006716 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006717 }
Victor Stinner74419f02020-07-03 11:35:37 +02006718 if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006719 return 1;
6720 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006721 if (tmp == NULL) {
6722 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
6723 return 1;
6724 }
6725 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006726 int res;
6727 Py_ssize_t len;
6728 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006729 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006730 PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006731 goto failed;
6732 }
6733 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006734 handlers = _Py_asdl_excepthandler_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006735 if (handlers == NULL) goto failed;
6736 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006737 excepthandler_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006738 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6739 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006740 res = obj2ast_excepthandler(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006741 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006743 if (len != PyList_GET_SIZE(tmp)) {
6744 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
6745 goto failed;
6746 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006747 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006748 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006749 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006750 }
Victor Stinner74419f02020-07-03 11:35:37 +02006751 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006752 return 1;
6753 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006754 if (tmp == NULL) {
6755 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
6756 return 1;
6757 }
6758 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006759 int res;
6760 Py_ssize_t len;
6761 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006762 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006763 PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006764 goto failed;
6765 }
6766 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006767 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006768 if (orelse == NULL) goto failed;
6769 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006770 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006771 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6772 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006773 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006774 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006775 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006776 if (len != PyList_GET_SIZE(tmp)) {
6777 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
6778 goto failed;
6779 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006780 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006781 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006782 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006783 }
Victor Stinner74419f02020-07-03 11:35:37 +02006784 if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006785 return 1;
6786 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006787 if (tmp == NULL) {
6788 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
6789 return 1;
6790 }
6791 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006792 int res;
6793 Py_ssize_t len;
6794 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006795 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006796 PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006797 goto failed;
6798 }
6799 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006800 finalbody = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006801 if (finalbody == NULL) goto failed;
6802 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006803 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006804 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6805 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006806 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006807 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006808 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006809 if (len != PyList_GET_SIZE(tmp)) {
6810 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
6811 goto failed;
6812 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006813 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006814 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006815 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006816 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006817 *out = _Py_Try(body, handlers, orelse, finalbody, lineno, col_offset,
6818 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006819 if (*out == NULL) goto failed;
6820 return 0;
6821 }
Victor Stinner74419f02020-07-03 11:35:37 +02006822 tp = state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006823 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006824 if (isinstance == -1) {
6825 return 1;
6826 }
6827 if (isinstance) {
6828 expr_ty test;
6829 expr_ty msg;
6830
Victor Stinner74419f02020-07-03 11:35:37 +02006831 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006832 return 1;
6833 }
6834 if (tmp == NULL) {
6835 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
6836 return 1;
6837 }
6838 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006839 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006840 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006841 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006842 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006843 }
Victor Stinner74419f02020-07-03 11:35:37 +02006844 if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006845 return 1;
6846 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006847 if (tmp == NULL || tmp == Py_None) {
6848 Py_CLEAR(tmp);
6849 msg = NULL;
6850 }
6851 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006852 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006853 res = obj2ast_expr(state, tmp, &msg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006854 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006855 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006856 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006857 *out = _Py_Assert(test, msg, lineno, col_offset, end_lineno,
6858 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006859 if (*out == NULL) goto failed;
6860 return 0;
6861 }
Victor Stinner74419f02020-07-03 11:35:37 +02006862 tp = state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006863 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006864 if (isinstance == -1) {
6865 return 1;
6866 }
6867 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006868 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006869
Victor Stinner74419f02020-07-03 11:35:37 +02006870 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006871 return 1;
6872 }
6873 if (tmp == NULL) {
6874 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
6875 return 1;
6876 }
6877 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006878 int res;
6879 Py_ssize_t len;
6880 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006881 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006882 PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006883 goto failed;
6884 }
6885 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006886 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006887 if (names == NULL) goto failed;
6888 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006889 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006890 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6891 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006892 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006893 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006894 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006895 if (len != PyList_GET_SIZE(tmp)) {
6896 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
6897 goto failed;
6898 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006899 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006900 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006901 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006902 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006903 *out = _Py_Import(names, lineno, col_offset, end_lineno,
6904 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006905 if (*out == NULL) goto failed;
6906 return 0;
6907 }
Victor Stinner74419f02020-07-03 11:35:37 +02006908 tp = state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006909 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006910 if (isinstance == -1) {
6911 return 1;
6912 }
6913 if (isinstance) {
6914 identifier module;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006915 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006916 int level;
6917
Victor Stinner74419f02020-07-03 11:35:37 +02006918 if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006919 return 1;
6920 }
6921 if (tmp == NULL || tmp == Py_None) {
6922 Py_CLEAR(tmp);
6923 module = NULL;
6924 }
6925 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006926 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006927 res = obj2ast_identifier(state, tmp, &module, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006928 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006929 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006930 }
Victor Stinner74419f02020-07-03 11:35:37 +02006931 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006932 return 1;
6933 }
6934 if (tmp == NULL) {
6935 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
6936 return 1;
6937 }
6938 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006939 int res;
6940 Py_ssize_t len;
6941 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006942 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006943 PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006944 goto failed;
6945 }
6946 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006947 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006948 if (names == NULL) goto failed;
6949 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006950 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006951 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6952 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006953 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006954 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006955 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006956 if (len != PyList_GET_SIZE(tmp)) {
6957 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6958 goto failed;
6959 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006960 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006961 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006962 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006963 }
Victor Stinner74419f02020-07-03 11:35:37 +02006964 if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006965 return 1;
6966 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006967 if (tmp == NULL || tmp == Py_None) {
6968 Py_CLEAR(tmp);
6969 level = 0;
6970 }
6971 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006972 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006973 res = obj2ast_int(state, tmp, &level, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006974 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006975 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006976 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02006977 *out = _Py_ImportFrom(module, names, level, lineno, col_offset,
6978 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006979 if (*out == NULL) goto failed;
6980 return 0;
6981 }
Victor Stinner74419f02020-07-03 11:35:37 +02006982 tp = state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006983 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006984 if (isinstance == -1) {
6985 return 1;
6986 }
6987 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006988 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006989
Victor Stinner74419f02020-07-03 11:35:37 +02006990 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006991 return 1;
6992 }
6993 if (tmp == NULL) {
6994 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6995 return 1;
6996 }
6997 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006998 int res;
6999 Py_ssize_t len;
7000 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007001 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007002 PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 goto failed;
7004 }
7005 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007006 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007007 if (names == NULL) goto failed;
7008 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007009 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007010 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7011 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007012 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007013 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007014 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007015 if (len != PyList_GET_SIZE(tmp)) {
7016 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
7017 goto failed;
7018 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007019 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007020 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007021 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007022 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007023 *out = _Py_Global(names, lineno, col_offset, end_lineno,
7024 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007025 if (*out == NULL) goto failed;
7026 return 0;
7027 }
Victor Stinner74419f02020-07-03 11:35:37 +02007028 tp = state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007029 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007030 if (isinstance == -1) {
7031 return 1;
7032 }
7033 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007034 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007035
Victor Stinner74419f02020-07-03 11:35:37 +02007036 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007037 return 1;
7038 }
7039 if (tmp == NULL) {
7040 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
7041 return 1;
7042 }
7043 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007044 int res;
7045 Py_ssize_t len;
7046 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007047 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007048 PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007049 goto failed;
7050 }
7051 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007052 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007053 if (names == NULL) goto failed;
7054 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007055 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007056 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7057 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007058 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007059 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007060 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007061 if (len != PyList_GET_SIZE(tmp)) {
7062 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
7063 goto failed;
7064 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007065 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007066 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007067 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007068 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007069 *out = _Py_Nonlocal(names, lineno, col_offset, end_lineno,
7070 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007071 if (*out == NULL) goto failed;
7072 return 0;
7073 }
Victor Stinner74419f02020-07-03 11:35:37 +02007074 tp = state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007075 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007076 if (isinstance == -1) {
7077 return 1;
7078 }
7079 if (isinstance) {
7080 expr_ty value;
7081
Victor Stinner74419f02020-07-03 11:35:37 +02007082 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007083 return 1;
7084 }
7085 if (tmp == NULL) {
7086 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
7087 return 1;
7088 }
7089 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007090 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007091 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007092 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007093 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007094 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007095 *out = _Py_Expr(value, lineno, col_offset, end_lineno, end_col_offset,
7096 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007097 if (*out == NULL) goto failed;
7098 return 0;
7099 }
Victor Stinner74419f02020-07-03 11:35:37 +02007100 tp = state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007101 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007102 if (isinstance == -1) {
7103 return 1;
7104 }
7105 if (isinstance) {
7106
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007107 *out = _Py_Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007108 if (*out == NULL) goto failed;
7109 return 0;
7110 }
Victor Stinner74419f02020-07-03 11:35:37 +02007111 tp = state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007112 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007113 if (isinstance == -1) {
7114 return 1;
7115 }
7116 if (isinstance) {
7117
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007118 *out = _Py_Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007119 if (*out == NULL) goto failed;
7120 return 0;
7121 }
Victor Stinner74419f02020-07-03 11:35:37 +02007122 tp = state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007123 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007124 if (isinstance == -1) {
7125 return 1;
7126 }
7127 if (isinstance) {
7128
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007129 *out = _Py_Continue(lineno, col_offset, end_lineno, end_col_offset,
7130 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007131 if (*out == NULL) goto failed;
7132 return 0;
7133 }
7134
7135 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
7136 failed:
7137 Py_XDECREF(tmp);
7138 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007139}
7140
7141int
Victor Stinner5cf47822020-11-02 22:03:28 +01007142obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
7143 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007144{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007145 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007146
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007147 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007148 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007149 int lineno;
7150 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007151 int end_lineno;
7152 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007153
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007154 if (obj == Py_None) {
7155 *out = NULL;
7156 return 0;
7157 }
Victor Stinner74419f02020-07-03 11:35:37 +02007158 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007159 return 1;
7160 }
7161 if (tmp == NULL) {
7162 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
7163 return 1;
7164 }
7165 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007166 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007167 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007168 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007169 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007170 }
Victor Stinner74419f02020-07-03 11:35:37 +02007171 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007172 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007173 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007174 if (tmp == NULL) {
7175 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
7176 return 1;
7177 }
7178 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007179 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007180 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007181 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007182 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007183 }
Victor Stinner74419f02020-07-03 11:35:37 +02007184 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007185 return 1;
7186 }
7187 if (tmp == NULL || tmp == Py_None) {
7188 Py_CLEAR(tmp);
7189 end_lineno = 0;
7190 }
7191 else {
7192 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007193 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007194 if (res != 0) goto failed;
7195 Py_CLEAR(tmp);
7196 }
Victor Stinner74419f02020-07-03 11:35:37 +02007197 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007198 return 1;
7199 }
7200 if (tmp == NULL || tmp == Py_None) {
7201 Py_CLEAR(tmp);
7202 end_col_offset = 0;
7203 }
7204 else {
7205 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007206 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007207 if (res != 0) goto failed;
7208 Py_CLEAR(tmp);
7209 }
Victor Stinner74419f02020-07-03 11:35:37 +02007210 tp = state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007211 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007212 if (isinstance == -1) {
7213 return 1;
7214 }
7215 if (isinstance) {
7216 boolop_ty op;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007217 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007218
Victor Stinner74419f02020-07-03 11:35:37 +02007219 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007220 return 1;
7221 }
7222 if (tmp == NULL) {
7223 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
7224 return 1;
7225 }
7226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007227 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007228 res = obj2ast_boolop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007229 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007230 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007231 }
Victor Stinner74419f02020-07-03 11:35:37 +02007232 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007233 return 1;
7234 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007235 if (tmp == NULL) {
7236 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
7237 return 1;
7238 }
7239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007240 int res;
7241 Py_ssize_t len;
7242 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007243 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007244 PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007245 goto failed;
7246 }
7247 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007248 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007249 if (values == NULL) goto failed;
7250 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007251 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007252 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7253 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007254 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007255 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007256 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007257 if (len != PyList_GET_SIZE(tmp)) {
7258 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
7259 goto failed;
7260 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007261 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007262 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007263 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007264 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007265 *out = _Py_BoolOp(op, values, lineno, col_offset, end_lineno,
7266 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007267 if (*out == NULL) goto failed;
7268 return 0;
7269 }
Victor Stinner74419f02020-07-03 11:35:37 +02007270 tp = state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007271 isinstance = PyObject_IsInstance(obj, tp);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007272 if (isinstance == -1) {
7273 return 1;
7274 }
7275 if (isinstance) {
7276 expr_ty target;
7277 expr_ty value;
7278
Victor Stinner74419f02020-07-03 11:35:37 +02007279 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007280 return 1;
7281 }
7282 if (tmp == NULL) {
7283 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
7284 return 1;
7285 }
7286 else {
7287 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007288 res = obj2ast_expr(state, tmp, &target, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007289 if (res != 0) goto failed;
7290 Py_CLEAR(tmp);
7291 }
Victor Stinner74419f02020-07-03 11:35:37 +02007292 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007293 return 1;
7294 }
7295 if (tmp == NULL) {
7296 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
7297 return 1;
7298 }
7299 else {
7300 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007301 res = obj2ast_expr(state, tmp, &value, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007302 if (res != 0) goto failed;
7303 Py_CLEAR(tmp);
7304 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007305 *out = _Py_NamedExpr(target, value, lineno, col_offset, end_lineno,
7306 end_col_offset, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007307 if (*out == NULL) goto failed;
7308 return 0;
7309 }
Victor Stinner74419f02020-07-03 11:35:37 +02007310 tp = state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007311 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007312 if (isinstance == -1) {
7313 return 1;
7314 }
7315 if (isinstance) {
7316 expr_ty left;
7317 operator_ty op;
7318 expr_ty right;
7319
Victor Stinner74419f02020-07-03 11:35:37 +02007320 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007321 return 1;
7322 }
7323 if (tmp == NULL) {
7324 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
7325 return 1;
7326 }
7327 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007328 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007329 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007331 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007332 }
Victor Stinner74419f02020-07-03 11:35:37 +02007333 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007334 return 1;
7335 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007336 if (tmp == NULL) {
7337 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
7338 return 1;
7339 }
7340 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007341 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007342 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007343 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007344 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007345 }
Victor Stinner74419f02020-07-03 11:35:37 +02007346 if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007347 return 1;
7348 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007349 if (tmp == NULL) {
7350 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
7351 return 1;
7352 }
7353 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007354 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007355 res = obj2ast_expr(state, tmp, &right, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007356 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007357 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007358 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007359 *out = _Py_BinOp(left, op, right, lineno, col_offset, end_lineno,
7360 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007361 if (*out == NULL) goto failed;
7362 return 0;
7363 }
Victor Stinner74419f02020-07-03 11:35:37 +02007364 tp = state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007365 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007366 if (isinstance == -1) {
7367 return 1;
7368 }
7369 if (isinstance) {
7370 unaryop_ty op;
7371 expr_ty operand;
7372
Victor Stinner74419f02020-07-03 11:35:37 +02007373 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007374 return 1;
7375 }
7376 if (tmp == NULL) {
7377 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
7378 return 1;
7379 }
7380 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007381 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007382 res = obj2ast_unaryop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007383 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007384 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007385 }
Victor Stinner74419f02020-07-03 11:35:37 +02007386 if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007387 return 1;
7388 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007389 if (tmp == NULL) {
7390 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
7391 return 1;
7392 }
7393 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007394 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007395 res = obj2ast_expr(state, tmp, &operand, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007396 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007397 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007398 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007399 *out = _Py_UnaryOp(op, operand, lineno, col_offset, end_lineno,
7400 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007401 if (*out == NULL) goto failed;
7402 return 0;
7403 }
Victor Stinner74419f02020-07-03 11:35:37 +02007404 tp = state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007405 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007406 if (isinstance == -1) {
7407 return 1;
7408 }
7409 if (isinstance) {
7410 arguments_ty args;
7411 expr_ty body;
7412
Victor Stinner74419f02020-07-03 11:35:37 +02007413 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007414 return 1;
7415 }
7416 if (tmp == NULL) {
7417 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
7418 return 1;
7419 }
7420 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007421 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007422 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007423 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007424 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007425 }
Victor Stinner74419f02020-07-03 11:35:37 +02007426 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007427 return 1;
7428 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007429 if (tmp == NULL) {
7430 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
7431 return 1;
7432 }
7433 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007434 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007435 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007436 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007437 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007438 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007439 *out = _Py_Lambda(args, body, lineno, col_offset, end_lineno,
7440 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007441 if (*out == NULL) goto failed;
7442 return 0;
7443 }
Victor Stinner74419f02020-07-03 11:35:37 +02007444 tp = state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007445 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007446 if (isinstance == -1) {
7447 return 1;
7448 }
7449 if (isinstance) {
7450 expr_ty test;
7451 expr_ty body;
7452 expr_ty orelse;
7453
Victor Stinner74419f02020-07-03 11:35:37 +02007454 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007455 return 1;
7456 }
7457 if (tmp == NULL) {
7458 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
7459 return 1;
7460 }
7461 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007462 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007463 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007464 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007465 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007466 }
Victor Stinner74419f02020-07-03 11:35:37 +02007467 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007468 return 1;
7469 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007470 if (tmp == NULL) {
7471 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
7472 return 1;
7473 }
7474 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007475 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007476 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007477 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007478 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007479 }
Victor Stinner74419f02020-07-03 11:35:37 +02007480 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007481 return 1;
7482 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007483 if (tmp == NULL) {
7484 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
7485 return 1;
7486 }
7487 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007488 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007489 res = obj2ast_expr(state, tmp, &orelse, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007491 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007492 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007493 *out = _Py_IfExp(test, body, orelse, lineno, col_offset, end_lineno,
7494 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007495 if (*out == NULL) goto failed;
7496 return 0;
7497 }
Victor Stinner74419f02020-07-03 11:35:37 +02007498 tp = state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007499 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007500 if (isinstance == -1) {
7501 return 1;
7502 }
7503 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007504 asdl_expr_seq* keys;
7505 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007506
Victor Stinner74419f02020-07-03 11:35:37 +02007507 if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007508 return 1;
7509 }
7510 if (tmp == NULL) {
7511 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
7512 return 1;
7513 }
7514 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007515 int res;
7516 Py_ssize_t len;
7517 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007518 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007519 PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007520 goto failed;
7521 }
7522 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007523 keys = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007524 if (keys == NULL) goto failed;
7525 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007526 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007527 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7528 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007529 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007530 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007531 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007532 if (len != PyList_GET_SIZE(tmp)) {
7533 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
7534 goto failed;
7535 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007536 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007537 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007538 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007539 }
Victor Stinner74419f02020-07-03 11:35:37 +02007540 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007541 return 1;
7542 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007543 if (tmp == NULL) {
7544 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
7545 return 1;
7546 }
7547 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007548 int res;
7549 Py_ssize_t len;
7550 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007551 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007552 PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007553 goto failed;
7554 }
7555 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007556 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007557 if (values == NULL) goto failed;
7558 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007559 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007560 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7561 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007562 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007563 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007564 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007565 if (len != PyList_GET_SIZE(tmp)) {
7566 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
7567 goto failed;
7568 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007569 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007570 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007571 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007572 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007573 *out = _Py_Dict(keys, values, lineno, col_offset, end_lineno,
7574 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007575 if (*out == NULL) goto failed;
7576 return 0;
7577 }
Victor Stinner74419f02020-07-03 11:35:37 +02007578 tp = state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007579 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007580 if (isinstance == -1) {
7581 return 1;
7582 }
7583 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007584 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007585
Victor Stinner74419f02020-07-03 11:35:37 +02007586 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007587 return 1;
7588 }
7589 if (tmp == NULL) {
7590 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
7591 return 1;
7592 }
7593 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007594 int res;
7595 Py_ssize_t len;
7596 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007597 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007598 PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007599 goto failed;
7600 }
7601 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007602 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007603 if (elts == NULL) goto failed;
7604 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007605 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007606 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7607 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007608 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007609 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007610 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007611 if (len != PyList_GET_SIZE(tmp)) {
7612 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
7613 goto failed;
7614 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007615 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007616 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007617 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007618 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007619 *out = _Py_Set(elts, lineno, col_offset, end_lineno, end_col_offset,
7620 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007621 if (*out == NULL) goto failed;
7622 return 0;
7623 }
Victor Stinner74419f02020-07-03 11:35:37 +02007624 tp = state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007625 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007626 if (isinstance == -1) {
7627 return 1;
7628 }
7629 if (isinstance) {
7630 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007631 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007632
Victor Stinner74419f02020-07-03 11:35:37 +02007633 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007634 return 1;
7635 }
7636 if (tmp == NULL) {
7637 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
7638 return 1;
7639 }
7640 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007641 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007642 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007643 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007644 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007645 }
Victor Stinner74419f02020-07-03 11:35:37 +02007646 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007647 return 1;
7648 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007649 if (tmp == NULL) {
7650 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
7651 return 1;
7652 }
7653 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007654 int res;
7655 Py_ssize_t len;
7656 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007657 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007658 PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007659 goto failed;
7660 }
7661 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007662 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007663 if (generators == NULL) goto failed;
7664 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007665 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007666 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7667 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007668 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007669 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007670 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007671 if (len != PyList_GET_SIZE(tmp)) {
7672 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
7673 goto failed;
7674 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007675 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007676 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007677 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007678 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007679 *out = _Py_ListComp(elt, generators, lineno, col_offset, end_lineno,
7680 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007681 if (*out == NULL) goto failed;
7682 return 0;
7683 }
Victor Stinner74419f02020-07-03 11:35:37 +02007684 tp = state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007685 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007686 if (isinstance == -1) {
7687 return 1;
7688 }
7689 if (isinstance) {
7690 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007691 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007692
Victor Stinner74419f02020-07-03 11:35:37 +02007693 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007694 return 1;
7695 }
7696 if (tmp == NULL) {
7697 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
7698 return 1;
7699 }
7700 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007701 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007702 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007703 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007704 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007705 }
Victor Stinner74419f02020-07-03 11:35:37 +02007706 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007707 return 1;
7708 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007709 if (tmp == NULL) {
7710 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
7711 return 1;
7712 }
7713 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007714 int res;
7715 Py_ssize_t len;
7716 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007717 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007718 PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007719 goto failed;
7720 }
7721 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007722 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007723 if (generators == NULL) goto failed;
7724 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007725 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007726 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7727 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007728 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007729 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007730 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007731 if (len != PyList_GET_SIZE(tmp)) {
7732 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
7733 goto failed;
7734 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007735 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007737 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007738 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007739 *out = _Py_SetComp(elt, generators, lineno, col_offset, end_lineno,
7740 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007741 if (*out == NULL) goto failed;
7742 return 0;
7743 }
Victor Stinner74419f02020-07-03 11:35:37 +02007744 tp = state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007745 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007746 if (isinstance == -1) {
7747 return 1;
7748 }
7749 if (isinstance) {
7750 expr_ty key;
7751 expr_ty value;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007752 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007753
Victor Stinner74419f02020-07-03 11:35:37 +02007754 if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007755 return 1;
7756 }
7757 if (tmp == NULL) {
7758 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
7759 return 1;
7760 }
7761 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007762 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007763 res = obj2ast_expr(state, tmp, &key, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007764 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007765 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007766 }
Victor Stinner74419f02020-07-03 11:35:37 +02007767 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007768 return 1;
7769 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007770 if (tmp == NULL) {
7771 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
7772 return 1;
7773 }
7774 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007775 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007776 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007777 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007778 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007779 }
Victor Stinner74419f02020-07-03 11:35:37 +02007780 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007781 return 1;
7782 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007783 if (tmp == NULL) {
7784 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
7785 return 1;
7786 }
7787 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007788 int res;
7789 Py_ssize_t len;
7790 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007791 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007792 PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007793 goto failed;
7794 }
7795 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007796 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007797 if (generators == NULL) goto failed;
7798 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007799 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007800 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7801 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007802 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007803 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007804 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007805 if (len != PyList_GET_SIZE(tmp)) {
7806 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
7807 goto failed;
7808 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007809 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007810 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007811 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007812 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007813 *out = _Py_DictComp(key, value, generators, lineno, col_offset,
7814 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007815 if (*out == NULL) goto failed;
7816 return 0;
7817 }
Victor Stinner74419f02020-07-03 11:35:37 +02007818 tp = state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007819 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007820 if (isinstance == -1) {
7821 return 1;
7822 }
7823 if (isinstance) {
7824 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007825 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007826
Victor Stinner74419f02020-07-03 11:35:37 +02007827 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007828 return 1;
7829 }
7830 if (tmp == NULL) {
7831 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
7832 return 1;
7833 }
7834 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007835 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007836 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007837 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007838 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007839 }
Victor Stinner74419f02020-07-03 11:35:37 +02007840 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007841 return 1;
7842 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007843 if (tmp == NULL) {
7844 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
7845 return 1;
7846 }
7847 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007848 int res;
7849 Py_ssize_t len;
7850 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007851 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007852 PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007853 goto failed;
7854 }
7855 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007856 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007857 if (generators == NULL) goto failed;
7858 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007859 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007860 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7861 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007862 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007863 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007864 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007865 if (len != PyList_GET_SIZE(tmp)) {
7866 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
7867 goto failed;
7868 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007869 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007870 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007871 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007872 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007873 *out = _Py_GeneratorExp(elt, generators, lineno, col_offset,
7874 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007875 if (*out == NULL) goto failed;
7876 return 0;
7877 }
Victor Stinner74419f02020-07-03 11:35:37 +02007878 tp = state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007879 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04007880 if (isinstance == -1) {
7881 return 1;
7882 }
7883 if (isinstance) {
7884 expr_ty value;
7885
Victor Stinner74419f02020-07-03 11:35:37 +02007886 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007887 return 1;
7888 }
7889 if (tmp == NULL) {
7890 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
7891 return 1;
7892 }
7893 else {
Yury Selivanov75445082015-05-11 22:57:16 -04007894 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007895 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007896 if (res != 0) goto failed;
7897 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04007898 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007899 *out = _Py_Await(value, lineno, col_offset, end_lineno, end_col_offset,
7900 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007901 if (*out == NULL) goto failed;
7902 return 0;
7903 }
Victor Stinner74419f02020-07-03 11:35:37 +02007904 tp = state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007905 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007906 if (isinstance == -1) {
7907 return 1;
7908 }
7909 if (isinstance) {
7910 expr_ty value;
7911
Victor Stinner74419f02020-07-03 11:35:37 +02007912 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007913 return 1;
7914 }
7915 if (tmp == NULL || tmp == Py_None) {
7916 Py_CLEAR(tmp);
7917 value = NULL;
7918 }
7919 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007920 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007921 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007922 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007923 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007924 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007925 *out = _Py_Yield(value, lineno, col_offset, end_lineno, end_col_offset,
7926 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007927 if (*out == NULL) goto failed;
7928 return 0;
7929 }
Victor Stinner74419f02020-07-03 11:35:37 +02007930 tp = state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007931 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007932 if (isinstance == -1) {
7933 return 1;
7934 }
7935 if (isinstance) {
7936 expr_ty value;
7937
Victor Stinner74419f02020-07-03 11:35:37 +02007938 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007939 return 1;
7940 }
7941 if (tmp == NULL) {
7942 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom");
7943 return 1;
7944 }
7945 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007946 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007947 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007948 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007949 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007950 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02007951 *out = _Py_YieldFrom(value, lineno, col_offset, end_lineno,
7952 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007953 if (*out == NULL) goto failed;
7954 return 0;
7955 }
Victor Stinner74419f02020-07-03 11:35:37 +02007956 tp = state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007957 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007958 if (isinstance == -1) {
7959 return 1;
7960 }
7961 if (isinstance) {
7962 expr_ty left;
7963 asdl_int_seq* ops;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007964 asdl_expr_seq* comparators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007965
Victor Stinner74419f02020-07-03 11:35:37 +02007966 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007967 return 1;
7968 }
7969 if (tmp == NULL) {
7970 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
7971 return 1;
7972 }
7973 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007974 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007975 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007976 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007977 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007978 }
Victor Stinner74419f02020-07-03 11:35:37 +02007979 if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007980 return 1;
7981 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007982 if (tmp == NULL) {
7983 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
7984 return 1;
7985 }
7986 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007987 int res;
7988 Py_ssize_t len;
7989 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007991 PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007992 goto failed;
7993 }
7994 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007995 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007996 if (ops == NULL) goto failed;
7997 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007998 cmpop_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007999 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8000 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008001 res = obj2ast_cmpop(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008002 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008003 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008004 if (len != PyList_GET_SIZE(tmp)) {
8005 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
8006 goto failed;
8007 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008008 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008009 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008010 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008011 }
Victor Stinner74419f02020-07-03 11:35:37 +02008012 if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008013 return 1;
8014 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008015 if (tmp == NULL) {
8016 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
8017 return 1;
8018 }
8019 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008020 int res;
8021 Py_ssize_t len;
8022 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008023 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008024 PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008025 goto failed;
8026 }
8027 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008028 comparators = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008029 if (comparators == NULL) goto failed;
8030 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008031 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008032 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8033 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008034 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008035 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008036 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008037 if (len != PyList_GET_SIZE(tmp)) {
8038 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
8039 goto failed;
8040 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008041 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008042 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008043 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008044 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008045 *out = _Py_Compare(left, ops, comparators, lineno, col_offset,
8046 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008047 if (*out == NULL) goto failed;
8048 return 0;
8049 }
Victor Stinner74419f02020-07-03 11:35:37 +02008050 tp = state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008051 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008052 if (isinstance == -1) {
8053 return 1;
8054 }
8055 if (isinstance) {
8056 expr_ty func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008057 asdl_expr_seq* args;
8058 asdl_keyword_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008059
Victor Stinner74419f02020-07-03 11:35:37 +02008060 if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008061 return 1;
8062 }
8063 if (tmp == NULL) {
8064 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
8065 return 1;
8066 }
8067 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008068 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008069 res = obj2ast_expr(state, tmp, &func, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008070 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008071 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008072 }
Victor Stinner74419f02020-07-03 11:35:37 +02008073 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008074 return 1;
8075 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008076 if (tmp == NULL) {
8077 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
8078 return 1;
8079 }
8080 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008081 int res;
8082 Py_ssize_t len;
8083 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008084 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008085 PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008086 goto failed;
8087 }
8088 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008089 args = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008090 if (args == NULL) goto failed;
8091 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008092 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008093 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8094 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008095 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008096 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008097 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008098 if (len != PyList_GET_SIZE(tmp)) {
8099 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
8100 goto failed;
8101 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008102 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008103 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008104 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008105 }
Victor Stinner74419f02020-07-03 11:35:37 +02008106 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008107 return 1;
8108 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008109 if (tmp == NULL) {
8110 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
8111 return 1;
8112 }
8113 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008114 int res;
8115 Py_ssize_t len;
8116 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008117 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008118 PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008119 goto failed;
8120 }
8121 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008122 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008123 if (keywords == NULL) goto failed;
8124 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008125 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008126 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8127 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008128 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008129 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008130 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008131 if (len != PyList_GET_SIZE(tmp)) {
8132 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
8133 goto failed;
8134 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008135 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008136 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008137 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008138 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008139 *out = _Py_Call(func, args, keywords, lineno, col_offset, end_lineno,
8140 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008141 if (*out == NULL) goto failed;
8142 return 0;
8143 }
Victor Stinner74419f02020-07-03 11:35:37 +02008144 tp = state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008145 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008146 if (isinstance == -1) {
8147 return 1;
8148 }
8149 if (isinstance) {
8150 expr_ty value;
8151 int conversion;
8152 expr_ty format_spec;
8153
Victor Stinner74419f02020-07-03 11:35:37 +02008154 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008155 return 1;
8156 }
8157 if (tmp == NULL) {
8158 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
8159 return 1;
8160 }
8161 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008162 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008163 res = obj2ast_expr(state, tmp, &value, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008164 if (res != 0) goto failed;
8165 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008166 }
Victor Stinner74419f02020-07-03 11:35:37 +02008167 if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008168 return 1;
8169 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008170 if (tmp == NULL || tmp == Py_None) {
8171 Py_CLEAR(tmp);
8172 conversion = 0;
8173 }
8174 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008175 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008176 res = obj2ast_int(state, tmp, &conversion, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008177 if (res != 0) goto failed;
8178 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008179 }
Victor Stinner74419f02020-07-03 11:35:37 +02008180 if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008181 return 1;
8182 }
8183 if (tmp == NULL || tmp == Py_None) {
8184 Py_CLEAR(tmp);
8185 format_spec = NULL;
8186 }
8187 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008188 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008189 res = obj2ast_expr(state, tmp, &format_spec, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008190 if (res != 0) goto failed;
8191 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008192 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008193 *out = _Py_FormattedValue(value, conversion, format_spec, lineno,
8194 col_offset, end_lineno, end_col_offset,
8195 arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008196 if (*out == NULL) goto failed;
8197 return 0;
8198 }
Victor Stinner74419f02020-07-03 11:35:37 +02008199 tp = state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008200 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008201 if (isinstance == -1) {
8202 return 1;
8203 }
8204 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008205 asdl_expr_seq* values;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008206
Victor Stinner74419f02020-07-03 11:35:37 +02008207 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008208 return 1;
8209 }
8210 if (tmp == NULL) {
8211 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
8212 return 1;
8213 }
8214 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008215 int res;
8216 Py_ssize_t len;
8217 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008218 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008219 PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Eric V. Smith235a6f02015-09-19 14:51:32 -04008220 goto failed;
8221 }
8222 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008223 values = _Py_asdl_expr_seq_new(len, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008224 if (values == NULL) goto failed;
8225 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008226 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008227 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8228 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008229 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008230 Py_DECREF(tmp2);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008231 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03008232 if (len != PyList_GET_SIZE(tmp)) {
8233 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
8234 goto failed;
8235 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008236 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008237 }
8238 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008239 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008240 *out = _Py_JoinedStr(values, lineno, col_offset, end_lineno,
8241 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008242 if (*out == NULL) goto failed;
8243 return 0;
8244 }
Victor Stinner74419f02020-07-03 11:35:37 +02008245 tp = state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008246 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008247 if (isinstance == -1) {
8248 return 1;
8249 }
8250 if (isinstance) {
8251 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008252 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008253
Victor Stinner74419f02020-07-03 11:35:37 +02008254 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008255 return 1;
8256 }
8257 if (tmp == NULL) {
8258 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
8259 return 1;
8260 }
8261 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008262 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008263 res = obj2ast_constant(state, tmp, &value, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008264 if (res != 0) goto failed;
8265 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008266 }
Victor Stinner74419f02020-07-03 11:35:37 +02008267 if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) {
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008268 return 1;
8269 }
8270 if (tmp == NULL || tmp == Py_None) {
8271 Py_CLEAR(tmp);
8272 kind = NULL;
8273 }
8274 else {
8275 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008276 res = obj2ast_string(state, tmp, &kind, arena);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008277 if (res != 0) goto failed;
8278 Py_CLEAR(tmp);
8279 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008280 *out = _Py_Constant(value, kind, lineno, col_offset, end_lineno,
8281 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008282 if (*out == NULL) goto failed;
8283 return 0;
8284 }
Victor Stinner74419f02020-07-03 11:35:37 +02008285 tp = state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008286 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008287 if (isinstance == -1) {
8288 return 1;
8289 }
8290 if (isinstance) {
8291 expr_ty value;
8292 identifier attr;
8293 expr_context_ty ctx;
8294
Victor Stinner74419f02020-07-03 11:35:37 +02008295 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008296 return 1;
8297 }
8298 if (tmp == NULL) {
8299 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
8300 return 1;
8301 }
8302 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008303 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008304 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008305 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008306 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008307 }
Victor Stinner74419f02020-07-03 11:35:37 +02008308 if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008309 return 1;
8310 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008311 if (tmp == NULL) {
8312 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
8313 return 1;
8314 }
8315 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008316 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008317 res = obj2ast_identifier(state, tmp, &attr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008318 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008319 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008320 }
Victor Stinner74419f02020-07-03 11:35:37 +02008321 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008322 return 1;
8323 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008324 if (tmp == NULL) {
8325 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
8326 return 1;
8327 }
8328 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008329 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008330 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008331 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008332 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008333 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008334 *out = _Py_Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
8335 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008336 if (*out == NULL) goto failed;
8337 return 0;
8338 }
Victor Stinner74419f02020-07-03 11:35:37 +02008339 tp = state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008340 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008341 if (isinstance == -1) {
8342 return 1;
8343 }
8344 if (isinstance) {
8345 expr_ty value;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008346 expr_ty slice;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008347 expr_context_ty ctx;
8348
Victor Stinner74419f02020-07-03 11:35:37 +02008349 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008350 return 1;
8351 }
8352 if (tmp == NULL) {
8353 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
8354 return 1;
8355 }
8356 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008357 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008358 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008359 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008360 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008361 }
Victor Stinner74419f02020-07-03 11:35:37 +02008362 if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008363 return 1;
8364 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008365 if (tmp == NULL) {
8366 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
8367 return 1;
8368 }
8369 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008370 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008371 res = obj2ast_expr(state, tmp, &slice, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008372 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008373 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008374 }
Victor Stinner74419f02020-07-03 11:35:37 +02008375 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008376 return 1;
8377 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008378 if (tmp == NULL) {
8379 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
8380 return 1;
8381 }
8382 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008383 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008384 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008385 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008386 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008387 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008388 *out = _Py_Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
8389 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008390 if (*out == NULL) goto failed;
8391 return 0;
8392 }
Victor Stinner74419f02020-07-03 11:35:37 +02008393 tp = state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008394 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008395 if (isinstance == -1) {
8396 return 1;
8397 }
8398 if (isinstance) {
8399 expr_ty value;
8400 expr_context_ty ctx;
8401
Victor Stinner74419f02020-07-03 11:35:37 +02008402 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008403 return 1;
8404 }
8405 if (tmp == NULL) {
8406 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
8407 return 1;
8408 }
8409 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008410 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008411 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008412 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008414 }
Victor Stinner74419f02020-07-03 11:35:37 +02008415 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008416 return 1;
8417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008418 if (tmp == NULL) {
8419 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
8420 return 1;
8421 }
8422 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008423 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008424 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008425 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008426 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008427 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008428 *out = _Py_Starred(value, ctx, lineno, col_offset, end_lineno,
8429 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008430 if (*out == NULL) goto failed;
8431 return 0;
8432 }
Victor Stinner74419f02020-07-03 11:35:37 +02008433 tp = state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008434 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008435 if (isinstance == -1) {
8436 return 1;
8437 }
8438 if (isinstance) {
8439 identifier id;
8440 expr_context_ty ctx;
8441
Victor Stinner74419f02020-07-03 11:35:37 +02008442 if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008443 return 1;
8444 }
8445 if (tmp == NULL) {
8446 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
8447 return 1;
8448 }
8449 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008450 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008451 res = obj2ast_identifier(state, tmp, &id, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008452 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008453 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008454 }
Victor Stinner74419f02020-07-03 11:35:37 +02008455 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008456 return 1;
8457 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008458 if (tmp == NULL) {
8459 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
8460 return 1;
8461 }
8462 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008463 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008464 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008465 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008466 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008467 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008468 *out = _Py_Name(id, ctx, lineno, col_offset, end_lineno,
8469 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008470 if (*out == NULL) goto failed;
8471 return 0;
8472 }
Victor Stinner74419f02020-07-03 11:35:37 +02008473 tp = state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008474 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008475 if (isinstance == -1) {
8476 return 1;
8477 }
8478 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008479 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008480 expr_context_ty ctx;
8481
Victor Stinner74419f02020-07-03 11:35:37 +02008482 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008483 return 1;
8484 }
8485 if (tmp == NULL) {
8486 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
8487 return 1;
8488 }
8489 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008490 int res;
8491 Py_ssize_t len;
8492 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008493 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008494 PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008495 goto failed;
8496 }
8497 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008498 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008499 if (elts == NULL) goto failed;
8500 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008501 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008502 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8503 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008504 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008505 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008506 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008507 if (len != PyList_GET_SIZE(tmp)) {
8508 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
8509 goto failed;
8510 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008511 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008512 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008513 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008514 }
Victor Stinner74419f02020-07-03 11:35:37 +02008515 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008516 return 1;
8517 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008518 if (tmp == NULL) {
8519 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
8520 return 1;
8521 }
8522 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008523 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008524 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008525 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008526 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008527 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008528 *out = _Py_List(elts, ctx, lineno, col_offset, end_lineno,
8529 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008530 if (*out == NULL) goto failed;
8531 return 0;
8532 }
Victor Stinner74419f02020-07-03 11:35:37 +02008533 tp = state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008534 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008535 if (isinstance == -1) {
8536 return 1;
8537 }
8538 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008539 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008540 expr_context_ty ctx;
8541
Victor Stinner74419f02020-07-03 11:35:37 +02008542 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008543 return 1;
8544 }
8545 if (tmp == NULL) {
8546 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
8547 return 1;
8548 }
8549 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008550 int res;
8551 Py_ssize_t len;
8552 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008553 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008554 PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008555 goto failed;
8556 }
8557 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008558 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008559 if (elts == NULL) goto failed;
8560 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008561 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008562 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8563 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008564 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008565 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008566 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008567 if (len != PyList_GET_SIZE(tmp)) {
8568 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
8569 goto failed;
8570 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008571 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008572 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008573 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008574 }
Victor Stinner74419f02020-07-03 11:35:37 +02008575 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008576 return 1;
8577 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008578 if (tmp == NULL) {
8579 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
8580 return 1;
8581 }
8582 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008583 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008584 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008585 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008586 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008587 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008588 *out = _Py_Tuple(elts, ctx, lineno, col_offset, end_lineno,
8589 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008590 if (*out == NULL) goto failed;
8591 return 0;
8592 }
Victor Stinner74419f02020-07-03 11:35:37 +02008593 tp = state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008594 isinstance = PyObject_IsInstance(obj, tp);
8595 if (isinstance == -1) {
8596 return 1;
8597 }
8598 if (isinstance) {
8599 expr_ty lower;
8600 expr_ty upper;
8601 expr_ty step;
8602
Victor Stinner74419f02020-07-03 11:35:37 +02008603 if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008604 return 1;
8605 }
8606 if (tmp == NULL || tmp == Py_None) {
8607 Py_CLEAR(tmp);
8608 lower = NULL;
8609 }
8610 else {
8611 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008612 res = obj2ast_expr(state, tmp, &lower, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008613 if (res != 0) goto failed;
8614 Py_CLEAR(tmp);
8615 }
Victor Stinner74419f02020-07-03 11:35:37 +02008616 if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008617 return 1;
8618 }
8619 if (tmp == NULL || tmp == Py_None) {
8620 Py_CLEAR(tmp);
8621 upper = NULL;
8622 }
8623 else {
8624 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008625 res = obj2ast_expr(state, tmp, &upper, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008626 if (res != 0) goto failed;
8627 Py_CLEAR(tmp);
8628 }
Victor Stinner74419f02020-07-03 11:35:37 +02008629 if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008630 return 1;
8631 }
8632 if (tmp == NULL || tmp == Py_None) {
8633 Py_CLEAR(tmp);
8634 step = NULL;
8635 }
8636 else {
8637 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008638 res = obj2ast_expr(state, tmp, &step, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008639 if (res != 0) goto failed;
8640 Py_CLEAR(tmp);
8641 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008642 *out = _Py_Slice(lower, upper, step, lineno, col_offset, end_lineno,
8643 end_col_offset, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008644 if (*out == NULL) goto failed;
8645 return 0;
8646 }
Brandt Bucher145bf262021-02-26 14:51:55 -08008647 tp = state->MatchAs_type;
8648 isinstance = PyObject_IsInstance(obj, tp);
8649 if (isinstance == -1) {
8650 return 1;
8651 }
8652 if (isinstance) {
8653 expr_ty pattern;
8654 identifier name;
8655
8656 if (_PyObject_LookupAttr(obj, state->pattern, &tmp) < 0) {
8657 return 1;
8658 }
8659 if (tmp == NULL) {
8660 PyErr_SetString(PyExc_TypeError, "required field \"pattern\" missing from MatchAs");
8661 return 1;
8662 }
8663 else {
8664 int res;
8665 res = obj2ast_expr(state, tmp, &pattern, arena);
8666 if (res != 0) goto failed;
8667 Py_CLEAR(tmp);
8668 }
8669 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
8670 return 1;
8671 }
8672 if (tmp == NULL) {
8673 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from MatchAs");
8674 return 1;
8675 }
8676 else {
8677 int res;
8678 res = obj2ast_identifier(state, tmp, &name, arena);
8679 if (res != 0) goto failed;
8680 Py_CLEAR(tmp);
8681 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008682 *out = _Py_MatchAs(pattern, name, lineno, col_offset, end_lineno,
8683 end_col_offset, arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08008684 if (*out == NULL) goto failed;
8685 return 0;
8686 }
8687 tp = state->MatchOr_type;
8688 isinstance = PyObject_IsInstance(obj, tp);
8689 if (isinstance == -1) {
8690 return 1;
8691 }
8692 if (isinstance) {
8693 asdl_expr_seq* patterns;
8694
8695 if (_PyObject_LookupAttr(obj, state->patterns, &tmp) < 0) {
8696 return 1;
8697 }
8698 if (tmp == NULL) {
8699 PyErr_SetString(PyExc_TypeError, "required field \"patterns\" missing from MatchOr");
8700 return 1;
8701 }
8702 else {
8703 int res;
8704 Py_ssize_t len;
8705 Py_ssize_t i;
8706 if (!PyList_Check(tmp)) {
8707 PyErr_Format(PyExc_TypeError, "MatchOr field \"patterns\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
8708 goto failed;
8709 }
8710 len = PyList_GET_SIZE(tmp);
8711 patterns = _Py_asdl_expr_seq_new(len, arena);
8712 if (patterns == NULL) goto failed;
8713 for (i = 0; i < len; i++) {
8714 expr_ty val;
8715 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8716 Py_INCREF(tmp2);
8717 res = obj2ast_expr(state, tmp2, &val, arena);
8718 Py_DECREF(tmp2);
8719 if (res != 0) goto failed;
8720 if (len != PyList_GET_SIZE(tmp)) {
8721 PyErr_SetString(PyExc_RuntimeError, "MatchOr field \"patterns\" changed size during iteration");
8722 goto failed;
8723 }
8724 asdl_seq_SET(patterns, i, val);
8725 }
8726 Py_CLEAR(tmp);
8727 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02008728 *out = _Py_MatchOr(patterns, lineno, col_offset, end_lineno,
8729 end_col_offset, arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08008730 if (*out == NULL) goto failed;
8731 return 0;
8732 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008733
8734 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
8735 failed:
8736 Py_XDECREF(tmp);
8737 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008738}
8739
8740int
Victor Stinner5cf47822020-11-02 22:03:28 +01008741obj2ast_expr_context(struct ast_state *state, PyObject* obj, expr_context_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02008742 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008743{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008744 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008745
Victor Stinner74419f02020-07-03 11:35:37 +02008746 isinstance = PyObject_IsInstance(obj, state->Load_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008747 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008748 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008749 }
8750 if (isinstance) {
8751 *out = Load;
8752 return 0;
8753 }
Victor Stinner74419f02020-07-03 11:35:37 +02008754 isinstance = PyObject_IsInstance(obj, state->Store_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008755 if (isinstance == -1) {
8756 return 1;
8757 }
8758 if (isinstance) {
8759 *out = Store;
8760 return 0;
8761 }
Victor Stinner74419f02020-07-03 11:35:37 +02008762 isinstance = PyObject_IsInstance(obj, state->Del_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008763 if (isinstance == -1) {
8764 return 1;
8765 }
8766 if (isinstance) {
8767 *out = Del;
8768 return 0;
8769 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008770
8771 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
8772 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008773}
8774
8775int
Victor Stinner5cf47822020-11-02 22:03:28 +01008776obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02008777 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008778{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008779 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008780
Victor Stinner74419f02020-07-03 11:35:37 +02008781 isinstance = PyObject_IsInstance(obj, state->And_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008782 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008783 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008784 }
8785 if (isinstance) {
8786 *out = And;
8787 return 0;
8788 }
Victor Stinner74419f02020-07-03 11:35:37 +02008789 isinstance = PyObject_IsInstance(obj, state->Or_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008790 if (isinstance == -1) {
8791 return 1;
8792 }
8793 if (isinstance) {
8794 *out = Or;
8795 return 0;
8796 }
8797
8798 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
8799 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008800}
8801
8802int
Victor Stinner5cf47822020-11-02 22:03:28 +01008803obj2ast_operator(struct ast_state *state, PyObject* obj, operator_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02008804 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008805{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008806 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008807
Victor Stinner74419f02020-07-03 11:35:37 +02008808 isinstance = PyObject_IsInstance(obj, state->Add_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008809 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008810 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008811 }
8812 if (isinstance) {
8813 *out = Add;
8814 return 0;
8815 }
Victor Stinner74419f02020-07-03 11:35:37 +02008816 isinstance = PyObject_IsInstance(obj, state->Sub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008817 if (isinstance == -1) {
8818 return 1;
8819 }
8820 if (isinstance) {
8821 *out = Sub;
8822 return 0;
8823 }
Victor Stinner74419f02020-07-03 11:35:37 +02008824 isinstance = PyObject_IsInstance(obj, state->Mult_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008825 if (isinstance == -1) {
8826 return 1;
8827 }
8828 if (isinstance) {
8829 *out = Mult;
8830 return 0;
8831 }
Victor Stinner74419f02020-07-03 11:35:37 +02008832 isinstance = PyObject_IsInstance(obj, state->MatMult_type);
Benjamin Petersond51374e2014-04-09 23:55:56 -04008833 if (isinstance == -1) {
8834 return 1;
8835 }
8836 if (isinstance) {
8837 *out = MatMult;
8838 return 0;
8839 }
Victor Stinner74419f02020-07-03 11:35:37 +02008840 isinstance = PyObject_IsInstance(obj, state->Div_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008841 if (isinstance == -1) {
8842 return 1;
8843 }
8844 if (isinstance) {
8845 *out = Div;
8846 return 0;
8847 }
Victor Stinner74419f02020-07-03 11:35:37 +02008848 isinstance = PyObject_IsInstance(obj, state->Mod_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008849 if (isinstance == -1) {
8850 return 1;
8851 }
8852 if (isinstance) {
8853 *out = Mod;
8854 return 0;
8855 }
Victor Stinner74419f02020-07-03 11:35:37 +02008856 isinstance = PyObject_IsInstance(obj, state->Pow_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008857 if (isinstance == -1) {
8858 return 1;
8859 }
8860 if (isinstance) {
8861 *out = Pow;
8862 return 0;
8863 }
Victor Stinner74419f02020-07-03 11:35:37 +02008864 isinstance = PyObject_IsInstance(obj, state->LShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008865 if (isinstance == -1) {
8866 return 1;
8867 }
8868 if (isinstance) {
8869 *out = LShift;
8870 return 0;
8871 }
Victor Stinner74419f02020-07-03 11:35:37 +02008872 isinstance = PyObject_IsInstance(obj, state->RShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008873 if (isinstance == -1) {
8874 return 1;
8875 }
8876 if (isinstance) {
8877 *out = RShift;
8878 return 0;
8879 }
Victor Stinner74419f02020-07-03 11:35:37 +02008880 isinstance = PyObject_IsInstance(obj, state->BitOr_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008881 if (isinstance == -1) {
8882 return 1;
8883 }
8884 if (isinstance) {
8885 *out = BitOr;
8886 return 0;
8887 }
Victor Stinner74419f02020-07-03 11:35:37 +02008888 isinstance = PyObject_IsInstance(obj, state->BitXor_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008889 if (isinstance == -1) {
8890 return 1;
8891 }
8892 if (isinstance) {
8893 *out = BitXor;
8894 return 0;
8895 }
Victor Stinner74419f02020-07-03 11:35:37 +02008896 isinstance = PyObject_IsInstance(obj, state->BitAnd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008897 if (isinstance == -1) {
8898 return 1;
8899 }
8900 if (isinstance) {
8901 *out = BitAnd;
8902 return 0;
8903 }
Victor Stinner74419f02020-07-03 11:35:37 +02008904 isinstance = PyObject_IsInstance(obj, state->FloorDiv_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008905 if (isinstance == -1) {
8906 return 1;
8907 }
8908 if (isinstance) {
8909 *out = FloorDiv;
8910 return 0;
8911 }
8912
8913 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
8914 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008915}
8916
8917int
Victor Stinner5cf47822020-11-02 22:03:28 +01008918obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty* out,
8919 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008920{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008921 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008922
Victor Stinner74419f02020-07-03 11:35:37 +02008923 isinstance = PyObject_IsInstance(obj, state->Invert_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008924 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008925 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008926 }
8927 if (isinstance) {
8928 *out = Invert;
8929 return 0;
8930 }
Victor Stinner74419f02020-07-03 11:35:37 +02008931 isinstance = PyObject_IsInstance(obj, state->Not_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008932 if (isinstance == -1) {
8933 return 1;
8934 }
8935 if (isinstance) {
8936 *out = Not;
8937 return 0;
8938 }
Victor Stinner74419f02020-07-03 11:35:37 +02008939 isinstance = PyObject_IsInstance(obj, state->UAdd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008940 if (isinstance == -1) {
8941 return 1;
8942 }
8943 if (isinstance) {
8944 *out = UAdd;
8945 return 0;
8946 }
Victor Stinner74419f02020-07-03 11:35:37 +02008947 isinstance = PyObject_IsInstance(obj, state->USub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008948 if (isinstance == -1) {
8949 return 1;
8950 }
8951 if (isinstance) {
8952 *out = USub;
8953 return 0;
8954 }
8955
8956 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
8957 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008958}
8959
8960int
Victor Stinner5cf47822020-11-02 22:03:28 +01008961obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02008962 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008963{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008964 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008965
Victor Stinner74419f02020-07-03 11:35:37 +02008966 isinstance = PyObject_IsInstance(obj, state->Eq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008967 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008968 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008969 }
8970 if (isinstance) {
8971 *out = Eq;
8972 return 0;
8973 }
Victor Stinner74419f02020-07-03 11:35:37 +02008974 isinstance = PyObject_IsInstance(obj, state->NotEq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008975 if (isinstance == -1) {
8976 return 1;
8977 }
8978 if (isinstance) {
8979 *out = NotEq;
8980 return 0;
8981 }
Victor Stinner74419f02020-07-03 11:35:37 +02008982 isinstance = PyObject_IsInstance(obj, state->Lt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008983 if (isinstance == -1) {
8984 return 1;
8985 }
8986 if (isinstance) {
8987 *out = Lt;
8988 return 0;
8989 }
Victor Stinner74419f02020-07-03 11:35:37 +02008990 isinstance = PyObject_IsInstance(obj, state->LtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008991 if (isinstance == -1) {
8992 return 1;
8993 }
8994 if (isinstance) {
8995 *out = LtE;
8996 return 0;
8997 }
Victor Stinner74419f02020-07-03 11:35:37 +02008998 isinstance = PyObject_IsInstance(obj, state->Gt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008999 if (isinstance == -1) {
9000 return 1;
9001 }
9002 if (isinstance) {
9003 *out = Gt;
9004 return 0;
9005 }
Victor Stinner74419f02020-07-03 11:35:37 +02009006 isinstance = PyObject_IsInstance(obj, state->GtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009007 if (isinstance == -1) {
9008 return 1;
9009 }
9010 if (isinstance) {
9011 *out = GtE;
9012 return 0;
9013 }
Victor Stinner74419f02020-07-03 11:35:37 +02009014 isinstance = PyObject_IsInstance(obj, state->Is_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009015 if (isinstance == -1) {
9016 return 1;
9017 }
9018 if (isinstance) {
9019 *out = Is;
9020 return 0;
9021 }
Victor Stinner74419f02020-07-03 11:35:37 +02009022 isinstance = PyObject_IsInstance(obj, state->IsNot_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009023 if (isinstance == -1) {
9024 return 1;
9025 }
9026 if (isinstance) {
9027 *out = IsNot;
9028 return 0;
9029 }
Victor Stinner74419f02020-07-03 11:35:37 +02009030 isinstance = PyObject_IsInstance(obj, state->In_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009031 if (isinstance == -1) {
9032 return 1;
9033 }
9034 if (isinstance) {
9035 *out = In;
9036 return 0;
9037 }
Victor Stinner74419f02020-07-03 11:35:37 +02009038 isinstance = PyObject_IsInstance(obj, state->NotIn_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009039 if (isinstance == -1) {
9040 return 1;
9041 }
9042 if (isinstance) {
9043 *out = NotIn;
9044 return 0;
9045 }
9046
9047 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
9048 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009049}
9050
9051int
Victor Stinner5cf47822020-11-02 22:03:28 +01009052obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02009053 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009054{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009055 PyObject* tmp = NULL;
9056 expr_ty target;
9057 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009058 asdl_expr_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009059 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009060
Victor Stinner74419f02020-07-03 11:35:37 +02009061 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009062 return 1;
9063 }
9064 if (tmp == NULL) {
9065 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
9066 return 1;
9067 }
9068 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009069 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009070 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009071 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009072 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009073 }
Victor Stinner74419f02020-07-03 11:35:37 +02009074 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009075 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009076 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009077 if (tmp == NULL) {
9078 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
9079 return 1;
9080 }
9081 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009082 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009083 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009084 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009085 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009086 }
Victor Stinner74419f02020-07-03 11:35:37 +02009087 if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009088 return 1;
9089 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009090 if (tmp == NULL) {
9091 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
9092 return 1;
9093 }
9094 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009095 int res;
9096 Py_ssize_t len;
9097 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009098 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009099 PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009100 goto failed;
9101 }
9102 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009103 ifs = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009104 if (ifs == NULL) goto failed;
9105 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009106 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009107 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9108 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009109 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009110 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009111 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009112 if (len != PyList_GET_SIZE(tmp)) {
9113 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
9114 goto failed;
9115 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009116 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009117 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009118 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009119 }
Victor Stinner74419f02020-07-03 11:35:37 +02009120 if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009121 return 1;
9122 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009123 if (tmp == NULL) {
9124 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
9125 return 1;
9126 }
9127 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009128 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009129 res = obj2ast_int(state, tmp, &is_async, arena);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009130 if (res != 0) goto failed;
9131 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07009132 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009133 *out = _Py_comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009134 return 0;
9135failed:
9136 Py_XDECREF(tmp);
9137 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009138}
9139
9140int
Victor Stinner5cf47822020-11-02 22:03:28 +01009141obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02009142 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009143{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009144 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00009145
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009146 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009147 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009148 int lineno;
9149 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009150 int end_lineno;
9151 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009152
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009153 if (obj == Py_None) {
9154 *out = NULL;
9155 return 0;
9156 }
Victor Stinner74419f02020-07-03 11:35:37 +02009157 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009158 return 1;
9159 }
9160 if (tmp == NULL) {
9161 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
9162 return 1;
9163 }
9164 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009165 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009166 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009167 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009168 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009169 }
Victor Stinner74419f02020-07-03 11:35:37 +02009170 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009171 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009172 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009173 if (tmp == NULL) {
9174 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
9175 return 1;
9176 }
9177 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009178 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009179 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009180 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009181 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009182 }
Victor Stinner74419f02020-07-03 11:35:37 +02009183 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009184 return 1;
9185 }
9186 if (tmp == NULL || tmp == Py_None) {
9187 Py_CLEAR(tmp);
9188 end_lineno = 0;
9189 }
9190 else {
9191 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009192 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009193 if (res != 0) goto failed;
9194 Py_CLEAR(tmp);
9195 }
Victor Stinner74419f02020-07-03 11:35:37 +02009196 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009197 return 1;
9198 }
9199 if (tmp == NULL || tmp == Py_None) {
9200 Py_CLEAR(tmp);
9201 end_col_offset = 0;
9202 }
9203 else {
9204 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009205 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009206 if (res != 0) goto failed;
9207 Py_CLEAR(tmp);
9208 }
Victor Stinner74419f02020-07-03 11:35:37 +02009209 tp = state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009210 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009211 if (isinstance == -1) {
9212 return 1;
9213 }
9214 if (isinstance) {
9215 expr_ty type;
9216 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009217 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009218
Victor Stinner74419f02020-07-03 11:35:37 +02009219 if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009220 return 1;
9221 }
9222 if (tmp == NULL || tmp == Py_None) {
9223 Py_CLEAR(tmp);
9224 type = NULL;
9225 }
9226 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009227 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009228 res = obj2ast_expr(state, tmp, &type, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009229 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009230 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009231 }
Victor Stinner74419f02020-07-03 11:35:37 +02009232 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009233 return 1;
9234 }
9235 if (tmp == NULL || tmp == Py_None) {
9236 Py_CLEAR(tmp);
9237 name = NULL;
9238 }
9239 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009240 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009241 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009242 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009243 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009244 }
Victor Stinner74419f02020-07-03 11:35:37 +02009245 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009246 return 1;
9247 }
9248 if (tmp == NULL) {
9249 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
9250 return 1;
9251 }
9252 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009253 int res;
9254 Py_ssize_t len;
9255 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009256 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009257 PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009258 goto failed;
9259 }
9260 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009261 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009262 if (body == NULL) goto failed;
9263 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009264 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009265 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9266 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009267 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009268 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009269 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009270 if (len != PyList_GET_SIZE(tmp)) {
9271 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
9272 goto failed;
9273 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009274 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009275 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009276 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009277 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009278 *out = _Py_ExceptHandler(type, name, body, lineno, col_offset,
9279 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009280 if (*out == NULL) goto failed;
9281 return 0;
9282 }
9283
9284 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
9285 failed:
9286 Py_XDECREF(tmp);
9287 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009288}
9289
9290int
Victor Stinner5cf47822020-11-02 22:03:28 +01009291obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009292 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009293{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009294 PyObject* tmp = NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009295 asdl_arg_seq* posonlyargs;
9296 asdl_arg_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009297 arg_ty vararg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009298 asdl_arg_seq* kwonlyargs;
9299 asdl_expr_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009300 arg_ty kwarg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009301 asdl_expr_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009302
Victor Stinner74419f02020-07-03 11:35:37 +02009303 if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009304 return 1;
9305 }
9306 if (tmp == NULL) {
9307 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
9308 return 1;
9309 }
9310 else {
9311 int res;
9312 Py_ssize_t len;
9313 Py_ssize_t i;
9314 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009315 PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009316 goto failed;
9317 }
9318 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009319 posonlyargs = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009320 if (posonlyargs == NULL) goto failed;
9321 for (i = 0; i < len; i++) {
9322 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009323 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9324 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009325 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009326 Py_DECREF(tmp2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009327 if (res != 0) goto failed;
9328 if (len != PyList_GET_SIZE(tmp)) {
9329 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
9330 goto failed;
9331 }
9332 asdl_seq_SET(posonlyargs, i, val);
9333 }
9334 Py_CLEAR(tmp);
9335 }
Victor Stinner74419f02020-07-03 11:35:37 +02009336 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009337 return 1;
9338 }
9339 if (tmp == NULL) {
9340 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
9341 return 1;
9342 }
9343 else {
9344 int res;
9345 Py_ssize_t len;
9346 Py_ssize_t i;
9347 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009348 PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009349 goto failed;
9350 }
9351 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009352 args = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009353 if (args == NULL) goto failed;
9354 for (i = 0; i < len; i++) {
9355 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009356 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9357 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009358 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009359 Py_DECREF(tmp2);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009360 if (res != 0) goto failed;
9361 if (len != PyList_GET_SIZE(tmp)) {
9362 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
9363 goto failed;
9364 }
9365 asdl_seq_SET(args, i, val);
9366 }
9367 Py_CLEAR(tmp);
9368 }
Victor Stinner74419f02020-07-03 11:35:37 +02009369 if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009370 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009371 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009372 if (tmp == NULL || tmp == Py_None) {
9373 Py_CLEAR(tmp);
9374 vararg = NULL;
9375 }
9376 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009377 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009378 res = obj2ast_arg(state, tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009379 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009380 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009381 }
Victor Stinner74419f02020-07-03 11:35:37 +02009382 if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009383 return 1;
9384 }
9385 if (tmp == NULL) {
9386 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
9387 return 1;
9388 }
9389 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009390 int res;
9391 Py_ssize_t len;
9392 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009393 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009394 PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009395 goto failed;
9396 }
9397 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009398 kwonlyargs = _Py_asdl_arg_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009399 if (kwonlyargs == NULL) goto failed;
9400 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009401 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009402 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9403 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009404 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009405 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009406 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009407 if (len != PyList_GET_SIZE(tmp)) {
9408 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
9409 goto failed;
9410 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009411 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009412 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009413 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009414 }
Victor Stinner74419f02020-07-03 11:35:37 +02009415 if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009416 return 1;
9417 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009418 if (tmp == NULL) {
9419 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
9420 return 1;
9421 }
9422 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009423 int res;
9424 Py_ssize_t len;
9425 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009426 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009427 PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009428 goto failed;
9429 }
9430 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009431 kw_defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009432 if (kw_defaults == NULL) goto failed;
9433 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009434 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009435 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9436 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009437 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009438 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009439 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009440 if (len != PyList_GET_SIZE(tmp)) {
9441 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
9442 goto failed;
9443 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009444 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009445 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009446 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009447 }
Victor Stinner74419f02020-07-03 11:35:37 +02009448 if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009449 return 1;
9450 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009451 if (tmp == NULL || tmp == Py_None) {
9452 Py_CLEAR(tmp);
9453 kwarg = NULL;
9454 }
9455 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009456 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009457 res = obj2ast_arg(state, tmp, &kwarg, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009458 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02009459 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009460 }
Victor Stinner74419f02020-07-03 11:35:37 +02009461 if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009462 return 1;
9463 }
9464 if (tmp == NULL) {
9465 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
9466 return 1;
9467 }
9468 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009469 int res;
9470 Py_ssize_t len;
9471 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009472 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009473 PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
Victor Stinneree4b59c2013-07-27 00:01:35 +02009474 goto failed;
9475 }
9476 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009477 defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009478 if (defaults == NULL) goto failed;
9479 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009480 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009481 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9482 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009483 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009484 Py_DECREF(tmp2);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009485 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009486 if (len != PyList_GET_SIZE(tmp)) {
9487 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
9488 goto failed;
9489 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009490 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009491 }
Victor Stinnerb3189902013-07-27 00:04:42 +02009492 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009493 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009494 *out = _Py_arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults,
9495 kwarg, defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009496 return 0;
9497failed:
9498 Py_XDECREF(tmp);
9499 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009500}
9501
9502int
Victor Stinner5cf47822020-11-02 22:03:28 +01009503obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009504{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009505 PyObject* tmp = NULL;
9506 identifier arg;
9507 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009508 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01009509 int lineno;
9510 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009511 int end_lineno;
9512 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009513
Victor Stinner74419f02020-07-03 11:35:37 +02009514 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009515 return 1;
9516 }
9517 if (tmp == NULL) {
9518 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
9519 return 1;
9520 }
9521 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009522 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009523 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009524 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009525 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009526 }
Victor Stinner74419f02020-07-03 11:35:37 +02009527 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009528 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009529 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009530 if (tmp == NULL || tmp == Py_None) {
9531 Py_CLEAR(tmp);
9532 annotation = NULL;
9533 }
9534 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009535 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009536 res = obj2ast_expr(state, tmp, &annotation, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009537 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009538 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009539 }
Victor Stinner74419f02020-07-03 11:35:37 +02009540 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009541 return 1;
9542 }
9543 if (tmp == NULL || tmp == Py_None) {
9544 Py_CLEAR(tmp);
9545 type_comment = NULL;
9546 }
9547 else {
9548 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009549 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009550 if (res != 0) goto failed;
9551 Py_CLEAR(tmp);
9552 }
Victor Stinner74419f02020-07-03 11:35:37 +02009553 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009554 return 1;
9555 }
9556 if (tmp == NULL) {
9557 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
9558 return 1;
9559 }
9560 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009561 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009562 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009563 if (res != 0) goto failed;
9564 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009565 }
Victor Stinner74419f02020-07-03 11:35:37 +02009566 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01009567 return 1;
9568 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009569 if (tmp == NULL) {
9570 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
9571 return 1;
9572 }
9573 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009574 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009575 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009576 if (res != 0) goto failed;
9577 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01009578 }
Victor Stinner74419f02020-07-03 11:35:37 +02009579 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009580 return 1;
9581 }
9582 if (tmp == NULL || tmp == Py_None) {
9583 Py_CLEAR(tmp);
9584 end_lineno = 0;
9585 }
9586 else {
9587 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009588 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009589 if (res != 0) goto failed;
9590 Py_CLEAR(tmp);
9591 }
Victor Stinner74419f02020-07-03 11:35:37 +02009592 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009593 return 1;
9594 }
9595 if (tmp == NULL || tmp == Py_None) {
9596 Py_CLEAR(tmp);
9597 end_col_offset = 0;
9598 }
9599 else {
9600 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009601 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009602 if (res != 0) goto failed;
9603 Py_CLEAR(tmp);
9604 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009605 *out = _Py_arg(arg, annotation, type_comment, lineno, col_offset,
9606 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009607 return 0;
9608failed:
9609 Py_XDECREF(tmp);
9610 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009611}
9612
9613int
Victor Stinner5cf47822020-11-02 22:03:28 +01009614obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out,
9615 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009616{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009617 PyObject* tmp = NULL;
9618 identifier arg;
9619 expr_ty value;
Pablo Galindo168660b2020-04-02 00:47:39 +01009620 int lineno;
9621 int col_offset;
9622 int end_lineno;
9623 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009624
Victor Stinner74419f02020-07-03 11:35:37 +02009625 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009626 return 1;
9627 }
9628 if (tmp == NULL || tmp == Py_None) {
9629 Py_CLEAR(tmp);
9630 arg = NULL;
9631 }
9632 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009633 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009634 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009635 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009636 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009637 }
Victor Stinner74419f02020-07-03 11:35:37 +02009638 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009639 return 1;
9640 }
9641 if (tmp == NULL) {
9642 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
9643 return 1;
9644 }
9645 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009646 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009647 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009648 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009649 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009650 }
Victor Stinner74419f02020-07-03 11:35:37 +02009651 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009652 return 1;
9653 }
9654 if (tmp == NULL) {
9655 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword");
9656 return 1;
9657 }
9658 else {
9659 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009660 res = obj2ast_int(state, tmp, &lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009661 if (res != 0) goto failed;
9662 Py_CLEAR(tmp);
9663 }
Victor Stinner74419f02020-07-03 11:35:37 +02009664 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009665 return 1;
9666 }
9667 if (tmp == NULL) {
9668 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword");
9669 return 1;
9670 }
9671 else {
9672 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009673 res = obj2ast_int(state, tmp, &col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009674 if (res != 0) goto failed;
9675 Py_CLEAR(tmp);
9676 }
Victor Stinner74419f02020-07-03 11:35:37 +02009677 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009678 return 1;
9679 }
9680 if (tmp == NULL || tmp == Py_None) {
9681 Py_CLEAR(tmp);
9682 end_lineno = 0;
9683 }
9684 else {
9685 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009686 res = obj2ast_int(state, tmp, &end_lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009687 if (res != 0) goto failed;
9688 Py_CLEAR(tmp);
9689 }
Victor Stinner74419f02020-07-03 11:35:37 +02009690 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009691 return 1;
9692 }
9693 if (tmp == NULL || tmp == Py_None) {
9694 Py_CLEAR(tmp);
9695 end_col_offset = 0;
9696 }
9697 else {
9698 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009699 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009700 if (res != 0) goto failed;
9701 Py_CLEAR(tmp);
9702 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009703 *out = _Py_keyword(arg, value, lineno, col_offset, end_lineno,
9704 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009705 return 0;
9706failed:
9707 Py_XDECREF(tmp);
9708 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009709}
9710
9711int
Victor Stinner5cf47822020-11-02 22:03:28 +01009712obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02009713 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009714{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009715 PyObject* tmp = NULL;
9716 identifier name;
9717 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009718
Victor Stinner74419f02020-07-03 11:35:37 +02009719 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009720 return 1;
9721 }
9722 if (tmp == NULL) {
9723 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
9724 return 1;
9725 }
9726 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009727 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009728 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009729 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009730 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009731 }
Victor Stinner74419f02020-07-03 11:35:37 +02009732 if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009733 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009734 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009735 if (tmp == NULL || tmp == Py_None) {
9736 Py_CLEAR(tmp);
9737 asname = NULL;
9738 }
9739 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009740 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009741 res = obj2ast_identifier(state, tmp, &asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009742 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009743 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009744 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009745 *out = _Py_alias(name, asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009746 return 0;
9747failed:
9748 Py_XDECREF(tmp);
9749 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009750}
9751
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009752int
Victor Stinner5cf47822020-11-02 22:03:28 +01009753obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009754 PyArena* arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009755{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009756 PyObject* tmp = NULL;
9757 expr_ty context_expr;
9758 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009759
Victor Stinner74419f02020-07-03 11:35:37 +02009760 if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009761 return 1;
9762 }
9763 if (tmp == NULL) {
9764 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
9765 return 1;
9766 }
9767 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009768 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009769 res = obj2ast_expr(state, tmp, &context_expr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009770 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009771 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009772 }
Victor Stinner74419f02020-07-03 11:35:37 +02009773 if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009774 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009775 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009776 if (tmp == NULL || tmp == Py_None) {
9777 Py_CLEAR(tmp);
9778 optional_vars = NULL;
9779 }
9780 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009781 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009782 res = obj2ast_expr(state, tmp, &optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009783 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009784 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009785 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009786 *out = _Py_withitem(context_expr, optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009787 return 0;
9788failed:
9789 Py_XDECREF(tmp);
9790 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009791}
9792
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009793int
Brandt Bucher145bf262021-02-26 14:51:55 -08009794obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out,
9795 PyArena* arena)
9796{
9797 PyObject* tmp = NULL;
9798 expr_ty pattern;
9799 expr_ty guard;
9800 asdl_stmt_seq* body;
9801
9802 if (_PyObject_LookupAttr(obj, state->pattern, &tmp) < 0) {
9803 return 1;
9804 }
9805 if (tmp == NULL) {
9806 PyErr_SetString(PyExc_TypeError, "required field \"pattern\" missing from match_case");
9807 return 1;
9808 }
9809 else {
9810 int res;
9811 res = obj2ast_expr(state, tmp, &pattern, arena);
9812 if (res != 0) goto failed;
9813 Py_CLEAR(tmp);
9814 }
9815 if (_PyObject_LookupAttr(obj, state->guard, &tmp) < 0) {
9816 return 1;
9817 }
9818 if (tmp == NULL || tmp == Py_None) {
9819 Py_CLEAR(tmp);
9820 guard = NULL;
9821 }
9822 else {
9823 int res;
9824 res = obj2ast_expr(state, tmp, &guard, arena);
9825 if (res != 0) goto failed;
9826 Py_CLEAR(tmp);
9827 }
9828 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
9829 return 1;
9830 }
9831 if (tmp == NULL) {
9832 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from match_case");
9833 return 1;
9834 }
9835 else {
9836 int res;
9837 Py_ssize_t len;
9838 Py_ssize_t i;
9839 if (!PyList_Check(tmp)) {
9840 PyErr_Format(PyExc_TypeError, "match_case field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
9841 goto failed;
9842 }
9843 len = PyList_GET_SIZE(tmp);
9844 body = _Py_asdl_stmt_seq_new(len, arena);
9845 if (body == NULL) goto failed;
9846 for (i = 0; i < len; i++) {
9847 stmt_ty val;
9848 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9849 Py_INCREF(tmp2);
9850 res = obj2ast_stmt(state, tmp2, &val, arena);
9851 Py_DECREF(tmp2);
9852 if (res != 0) goto failed;
9853 if (len != PyList_GET_SIZE(tmp)) {
9854 PyErr_SetString(PyExc_RuntimeError, "match_case field \"body\" changed size during iteration");
9855 goto failed;
9856 }
9857 asdl_seq_SET(body, i, val);
9858 }
9859 Py_CLEAR(tmp);
9860 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009861 *out = _Py_match_case(pattern, guard, body, arena);
Brandt Bucher145bf262021-02-26 14:51:55 -08009862 return 0;
9863failed:
9864 Py_XDECREF(tmp);
9865 return 1;
9866}
9867
9868int
Victor Stinner5cf47822020-11-02 22:03:28 +01009869obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty*
9870 out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009871{
9872 int isinstance;
9873
9874 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009875 PyObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009876
9877 if (obj == Py_None) {
9878 *out = NULL;
9879 return 0;
9880 }
Victor Stinner74419f02020-07-03 11:35:37 +02009881 tp = state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009882 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009883 if (isinstance == -1) {
9884 return 1;
9885 }
9886 if (isinstance) {
9887 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009888 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009889
Victor Stinner74419f02020-07-03 11:35:37 +02009890 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009891 return 1;
9892 }
9893 if (tmp == NULL) {
9894 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
9895 return 1;
9896 }
9897 else {
9898 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009899 res = obj2ast_int(state, tmp, &lineno, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009900 if (res != 0) goto failed;
9901 Py_CLEAR(tmp);
9902 }
Victor Stinner74419f02020-07-03 11:35:37 +02009903 if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009904 return 1;
9905 }
9906 if (tmp == NULL) {
9907 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
9908 return 1;
9909 }
9910 else {
9911 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009912 res = obj2ast_string(state, tmp, &tag, arena);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009913 if (res != 0) goto failed;
9914 Py_CLEAR(tmp);
9915 }
Victor Stinnerd36d6a92021-04-07 13:01:09 +02009916 *out = _Py_TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009917 if (*out == NULL) goto failed;
9918 return 0;
9919 }
9920
9921 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
9922 failed:
9923 Py_XDECREF(tmp);
9924 return 1;
9925}
9926
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009927
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009928static int
9929astmodule_exec(PyObject *m)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00009930{
Victor Stinner5cf47822020-11-02 22:03:28 +01009931 struct ast_state *state = get_ast_state();
9932 if (state == NULL) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009933 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +02009934 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009935 if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009936 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009937 }
Brandt Bucherd2f96672020-02-06 06:45:46 -08009938 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009939 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009940 }
9941 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009942 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009943 }
9944 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009945 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009946 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009947 if (PyModule_AddObjectRef(m, "mod", state->mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009948 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009949 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009950 if (PyModule_AddObjectRef(m, "Module", state->Module_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009951 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009952 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009953 if (PyModule_AddObjectRef(m, "Interactive", state->Interactive_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009954 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009955 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009956 if (PyModule_AddObjectRef(m, "Expression", state->Expression_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009957 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009958 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009959 if (PyModule_AddObjectRef(m, "FunctionType", state->FunctionType_type) < 0)
9960 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009961 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009962 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009963 if (PyModule_AddObjectRef(m, "stmt", state->stmt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009964 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009965 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009966 if (PyModule_AddObjectRef(m, "FunctionDef", state->FunctionDef_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009967 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009968 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009969 if (PyModule_AddObjectRef(m, "AsyncFunctionDef",
9970 state->AsyncFunctionDef_type) < 0) {
9971 return -1;
9972 }
9973 if (PyModule_AddObjectRef(m, "ClassDef", state->ClassDef_type) < 0) {
9974 return -1;
9975 }
9976 if (PyModule_AddObjectRef(m, "Return", state->Return_type) < 0) {
9977 return -1;
9978 }
9979 if (PyModule_AddObjectRef(m, "Delete", state->Delete_type) < 0) {
9980 return -1;
9981 }
9982 if (PyModule_AddObjectRef(m, "Assign", state->Assign_type) < 0) {
9983 return -1;
9984 }
9985 if (PyModule_AddObjectRef(m, "AugAssign", state->AugAssign_type) < 0) {
9986 return -1;
9987 }
9988 if (PyModule_AddObjectRef(m, "AnnAssign", state->AnnAssign_type) < 0) {
9989 return -1;
9990 }
9991 if (PyModule_AddObjectRef(m, "For", state->For_type) < 0) {
9992 return -1;
9993 }
9994 if (PyModule_AddObjectRef(m, "AsyncFor", state->AsyncFor_type) < 0) {
9995 return -1;
9996 }
9997 if (PyModule_AddObjectRef(m, "While", state->While_type) < 0) {
9998 return -1;
9999 }
10000 if (PyModule_AddObjectRef(m, "If", state->If_type) < 0) {
10001 return -1;
10002 }
10003 if (PyModule_AddObjectRef(m, "With", state->With_type) < 0) {
10004 return -1;
10005 }
10006 if (PyModule_AddObjectRef(m, "AsyncWith", state->AsyncWith_type) < 0) {
10007 return -1;
10008 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010009 if (PyModule_AddObjectRef(m, "Match", state->Match_type) < 0) {
10010 return -1;
10011 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010012 if (PyModule_AddObjectRef(m, "Raise", state->Raise_type) < 0) {
10013 return -1;
10014 }
10015 if (PyModule_AddObjectRef(m, "Try", state->Try_type) < 0) {
10016 return -1;
10017 }
10018 if (PyModule_AddObjectRef(m, "Assert", state->Assert_type) < 0) {
10019 return -1;
10020 }
10021 if (PyModule_AddObjectRef(m, "Import", state->Import_type) < 0) {
10022 return -1;
10023 }
10024 if (PyModule_AddObjectRef(m, "ImportFrom", state->ImportFrom_type) < 0) {
10025 return -1;
10026 }
10027 if (PyModule_AddObjectRef(m, "Global", state->Global_type) < 0) {
10028 return -1;
10029 }
10030 if (PyModule_AddObjectRef(m, "Nonlocal", state->Nonlocal_type) < 0) {
10031 return -1;
10032 }
10033 if (PyModule_AddObjectRef(m, "Expr", state->Expr_type) < 0) {
10034 return -1;
10035 }
10036 if (PyModule_AddObjectRef(m, "Pass", state->Pass_type) < 0) {
10037 return -1;
10038 }
10039 if (PyModule_AddObjectRef(m, "Break", state->Break_type) < 0) {
10040 return -1;
10041 }
10042 if (PyModule_AddObjectRef(m, "Continue", state->Continue_type) < 0) {
10043 return -1;
10044 }
10045 if (PyModule_AddObjectRef(m, "expr", state->expr_type) < 0) {
10046 return -1;
10047 }
10048 if (PyModule_AddObjectRef(m, "BoolOp", state->BoolOp_type) < 0) {
10049 return -1;
10050 }
10051 if (PyModule_AddObjectRef(m, "NamedExpr", state->NamedExpr_type) < 0) {
10052 return -1;
10053 }
10054 if (PyModule_AddObjectRef(m, "BinOp", state->BinOp_type) < 0) {
10055 return -1;
10056 }
10057 if (PyModule_AddObjectRef(m, "UnaryOp", state->UnaryOp_type) < 0) {
10058 return -1;
10059 }
10060 if (PyModule_AddObjectRef(m, "Lambda", state->Lambda_type) < 0) {
10061 return -1;
10062 }
10063 if (PyModule_AddObjectRef(m, "IfExp", state->IfExp_type) < 0) {
10064 return -1;
10065 }
10066 if (PyModule_AddObjectRef(m, "Dict", state->Dict_type) < 0) {
10067 return -1;
10068 }
10069 if (PyModule_AddObjectRef(m, "Set", state->Set_type) < 0) {
10070 return -1;
10071 }
10072 if (PyModule_AddObjectRef(m, "ListComp", state->ListComp_type) < 0) {
10073 return -1;
10074 }
10075 if (PyModule_AddObjectRef(m, "SetComp", state->SetComp_type) < 0) {
10076 return -1;
10077 }
10078 if (PyModule_AddObjectRef(m, "DictComp", state->DictComp_type) < 0) {
10079 return -1;
10080 }
10081 if (PyModule_AddObjectRef(m, "GeneratorExp", state->GeneratorExp_type) < 0)
10082 {
10083 return -1;
10084 }
10085 if (PyModule_AddObjectRef(m, "Await", state->Await_type) < 0) {
10086 return -1;
10087 }
10088 if (PyModule_AddObjectRef(m, "Yield", state->Yield_type) < 0) {
10089 return -1;
10090 }
10091 if (PyModule_AddObjectRef(m, "YieldFrom", state->YieldFrom_type) < 0) {
10092 return -1;
10093 }
10094 if (PyModule_AddObjectRef(m, "Compare", state->Compare_type) < 0) {
10095 return -1;
10096 }
10097 if (PyModule_AddObjectRef(m, "Call", state->Call_type) < 0) {
10098 return -1;
10099 }
10100 if (PyModule_AddObjectRef(m, "FormattedValue", state->FormattedValue_type)
Brandt Bucherd2f96672020-02-06 06:45:46 -080010101 < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010102 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010103 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010104 if (PyModule_AddObjectRef(m, "JoinedStr", state->JoinedStr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010105 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010106 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010107 if (PyModule_AddObjectRef(m, "Constant", state->Constant_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010108 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010109 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010110 if (PyModule_AddObjectRef(m, "Attribute", state->Attribute_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010111 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010112 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010113 if (PyModule_AddObjectRef(m, "Subscript", state->Subscript_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010114 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010115 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010116 if (PyModule_AddObjectRef(m, "Starred", state->Starred_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010117 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010118 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010119 if (PyModule_AddObjectRef(m, "Name", state->Name_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010120 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010121 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010122 if (PyModule_AddObjectRef(m, "List", state->List_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010123 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010124 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010125 if (PyModule_AddObjectRef(m, "Tuple", state->Tuple_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010126 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010127 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010128 if (PyModule_AddObjectRef(m, "Slice", state->Slice_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010129 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010130 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010131 if (PyModule_AddObjectRef(m, "MatchAs", state->MatchAs_type) < 0) {
10132 return -1;
10133 }
10134 if (PyModule_AddObjectRef(m, "MatchOr", state->MatchOr_type) < 0) {
10135 return -1;
10136 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010137 if (PyModule_AddObjectRef(m, "expr_context", state->expr_context_type) < 0)
10138 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010139 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010140 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010141 if (PyModule_AddObjectRef(m, "Load", state->Load_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010142 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010143 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010144 if (PyModule_AddObjectRef(m, "Store", state->Store_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010145 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010146 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010147 if (PyModule_AddObjectRef(m, "Del", state->Del_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010148 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010149 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010150 if (PyModule_AddObjectRef(m, "boolop", state->boolop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010151 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010152 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010153 if (PyModule_AddObjectRef(m, "And", state->And_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010154 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010155 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010156 if (PyModule_AddObjectRef(m, "Or", state->Or_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010157 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010158 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010159 if (PyModule_AddObjectRef(m, "operator", state->operator_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010160 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010161 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010162 if (PyModule_AddObjectRef(m, "Add", state->Add_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010163 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010164 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010165 if (PyModule_AddObjectRef(m, "Sub", state->Sub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010166 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010167 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010168 if (PyModule_AddObjectRef(m, "Mult", state->Mult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010169 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010170 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010171 if (PyModule_AddObjectRef(m, "MatMult", state->MatMult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010172 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010173 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010174 if (PyModule_AddObjectRef(m, "Div", state->Div_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010175 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010176 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010177 if (PyModule_AddObjectRef(m, "Mod", state->Mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010178 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010179 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010180 if (PyModule_AddObjectRef(m, "Pow", state->Pow_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010181 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010182 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010183 if (PyModule_AddObjectRef(m, "LShift", state->LShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010184 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010185 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010186 if (PyModule_AddObjectRef(m, "RShift", state->RShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010187 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010188 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010189 if (PyModule_AddObjectRef(m, "BitOr", state->BitOr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010190 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010191 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010192 if (PyModule_AddObjectRef(m, "BitXor", state->BitXor_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010193 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010194 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010195 if (PyModule_AddObjectRef(m, "BitAnd", state->BitAnd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010196 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010197 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010198 if (PyModule_AddObjectRef(m, "FloorDiv", state->FloorDiv_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010199 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010200 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010201 if (PyModule_AddObjectRef(m, "unaryop", state->unaryop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010202 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010203 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010204 if (PyModule_AddObjectRef(m, "Invert", state->Invert_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010205 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010206 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010207 if (PyModule_AddObjectRef(m, "Not", state->Not_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010208 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010209 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010210 if (PyModule_AddObjectRef(m, "UAdd", state->UAdd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010211 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010212 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010213 if (PyModule_AddObjectRef(m, "USub", state->USub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010214 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010215 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010216 if (PyModule_AddObjectRef(m, "cmpop", state->cmpop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010217 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010218 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010219 if (PyModule_AddObjectRef(m, "Eq", state->Eq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010220 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010221 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010222 if (PyModule_AddObjectRef(m, "NotEq", state->NotEq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010223 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010224 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010225 if (PyModule_AddObjectRef(m, "Lt", state->Lt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010226 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010227 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010228 if (PyModule_AddObjectRef(m, "LtE", state->LtE_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010229 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010230 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010231 if (PyModule_AddObjectRef(m, "Gt", state->Gt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010232 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010233 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010234 if (PyModule_AddObjectRef(m, "GtE", state->GtE_type) < 0) {
10235 return -1;
10236 }
10237 if (PyModule_AddObjectRef(m, "Is", state->Is_type) < 0) {
10238 return -1;
10239 }
10240 if (PyModule_AddObjectRef(m, "IsNot", state->IsNot_type) < 0) {
10241 return -1;
10242 }
10243 if (PyModule_AddObjectRef(m, "In", state->In_type) < 0) {
10244 return -1;
10245 }
10246 if (PyModule_AddObjectRef(m, "NotIn", state->NotIn_type) < 0) {
10247 return -1;
10248 }
10249 if (PyModule_AddObjectRef(m, "comprehension", state->comprehension_type) <
Brandt Bucherd2f96672020-02-06 06:45:46 -080010250 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010251 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010252 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010253 if (PyModule_AddObjectRef(m, "excepthandler", state->excepthandler_type) <
10254 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010255 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010256 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010257 if (PyModule_AddObjectRef(m, "ExceptHandler", state->ExceptHandler_type) <
10258 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010259 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010260 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010261 if (PyModule_AddObjectRef(m, "arguments", state->arguments_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010262 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010263 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010264 if (PyModule_AddObjectRef(m, "arg", state->arg_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010265 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010266 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010267 if (PyModule_AddObjectRef(m, "keyword", state->keyword_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010268 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010269 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010270 if (PyModule_AddObjectRef(m, "alias", state->alias_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010271 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010272 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010273 if (PyModule_AddObjectRef(m, "withitem", state->withitem_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010274 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010275 }
Brandt Bucher145bf262021-02-26 14:51:55 -080010276 if (PyModule_AddObjectRef(m, "match_case", state->match_case_type) < 0) {
10277 return -1;
10278 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010279 if (PyModule_AddObjectRef(m, "type_ignore", state->type_ignore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010280 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010281 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010282 if (PyModule_AddObjectRef(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010283 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010284 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010285 return 0;
10286}
Victor Stinner91e1bc12020-07-03 14:15:53 +020010287
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010288static PyModuleDef_Slot astmodule_slots[] = {
10289 {Py_mod_exec, astmodule_exec},
10290 {0, NULL}
10291};
10292
10293static struct PyModuleDef _astmodule = {
10294 PyModuleDef_HEAD_INIT,
10295 .m_name = "_ast",
Victor Stinner5cf47822020-11-02 22:03:28 +010010296 // The _ast module uses a per-interpreter state (PyInterpreterState.ast)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020010297 .m_size = 0,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010298 .m_slots = astmodule_slots,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010299};
10300
10301PyMODINIT_FUNC
10302PyInit__ast(void)
10303{
10304 return PyModuleDef_Init(&_astmodule);
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010305}
10306
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010307
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010308PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010309{
Victor Stinner5cf47822020-11-02 22:03:28 +010010310 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010311 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010312 return NULL;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010313 }
Victor Stinner74419f02020-07-03 11:35:37 +020010314 return ast2obj_mod(state, t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010315}
Martin v. Löwis5b222132007-06-10 09:51:05 +000010316
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010317/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
10318mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010319{
Serhiy Storchaka43c97312019-09-10 13:02:30 +030010320 const char * const req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010321 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010322
Steve Dowerb82e17e2019-05-23 08:45:22 -070010323 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
10324 return NULL;
10325 }
10326
Victor Stinner5cf47822020-11-02 22:03:28 +010010327 struct ast_state *state = get_ast_state();
10328 if (state == NULL) {
10329 return NULL;
10330 }
10331
Victor Stinner74419f02020-07-03 11:35:37 +020010332 PyObject *req_type[3];
10333 req_type[0] = state->Module_type;
10334 req_type[1] = state->Expression_type;
10335 req_type[2] = state->Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010336
Guido van Rossum3a32e3b2019-02-01 11:37:34 -080010337 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010338
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010339 isinstance = PyObject_IsInstance(ast, req_type[mode]);
10340 if (isinstance == -1)
10341 return NULL;
10342 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010343 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
Dino Viehlandac46eb42019-09-11 10:16:34 -070010344 req_name[mode], _PyType_Name(Py_TYPE(ast)));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010345 return NULL;
10346 }
Dong-hee Naa05fcd32019-10-10 16:41:26 +090010347
10348 mod_ty res = NULL;
Victor Stinner74419f02020-07-03 11:35:37 +020010349 if (obj2ast_mod(state, ast, &res, arena) != 0)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010350 return NULL;
10351 else
10352 return res;
10353}
10354
10355int PyAST_Check(PyObject* obj)
10356{
Victor Stinner5cf47822020-11-02 22:03:28 +010010357 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010358 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010359 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010360 }
Victor Stinner74419f02020-07-03 11:35:37 +020010361 return PyObject_IsInstance(obj, state->AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010362}
10363
Martin v. Löwis5b222132007-06-10 09:51:05 +000010364