blob: debd3e3542f5e7955235a071b3b98bd7a5100c81 [file] [log] [blame]
Victor Stinner5cf47822020-11-02 22:03:28 +01001// File automatically generated by Parser/asdl_c.py.
2
Thomas Wouterscf297e42007-02-23 15:07:44 +00003
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07004#include <stddef.h>
5
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006#include "Python.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007
Victor Stinner5cf47822020-11-02 22:03:28 +01008#ifdef Py_BUILD_CORE
9# include "pycore_ast.h" // struct ast_state
10# include "pycore_interp.h" // _PyInterpreterState.ast
11# include "pycore_pystate.h" // _PyInterpreterState_GET()
12#else
13struct ast_state {
Dino Viehlandac46eb42019-09-11 10:16:34 -070014 int initialized;
15 PyObject *AST_type;
16 PyObject *Add_singleton;
17 PyObject *Add_type;
18 PyObject *And_singleton;
19 PyObject *And_type;
20 PyObject *AnnAssign_type;
21 PyObject *Assert_type;
22 PyObject *Assign_type;
23 PyObject *AsyncFor_type;
24 PyObject *AsyncFunctionDef_type;
25 PyObject *AsyncWith_type;
26 PyObject *Attribute_type;
27 PyObject *AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070028 PyObject *Await_type;
29 PyObject *BinOp_type;
30 PyObject *BitAnd_singleton;
31 PyObject *BitAnd_type;
32 PyObject *BitOr_singleton;
33 PyObject *BitOr_type;
34 PyObject *BitXor_singleton;
35 PyObject *BitXor_type;
36 PyObject *BoolOp_type;
37 PyObject *Break_type;
38 PyObject *Call_type;
39 PyObject *ClassDef_type;
40 PyObject *Compare_type;
41 PyObject *Constant_type;
42 PyObject *Continue_type;
43 PyObject *Del_singleton;
44 PyObject *Del_type;
45 PyObject *Delete_type;
46 PyObject *DictComp_type;
47 PyObject *Dict_type;
48 PyObject *Div_singleton;
49 PyObject *Div_type;
50 PyObject *Eq_singleton;
51 PyObject *Eq_type;
52 PyObject *ExceptHandler_type;
53 PyObject *Expr_type;
54 PyObject *Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070055 PyObject *FloorDiv_singleton;
56 PyObject *FloorDiv_type;
57 PyObject *For_type;
58 PyObject *FormattedValue_type;
59 PyObject *FunctionDef_type;
60 PyObject *FunctionType_type;
61 PyObject *GeneratorExp_type;
62 PyObject *Global_type;
63 PyObject *GtE_singleton;
64 PyObject *GtE_type;
65 PyObject *Gt_singleton;
66 PyObject *Gt_type;
67 PyObject *IfExp_type;
68 PyObject *If_type;
69 PyObject *ImportFrom_type;
70 PyObject *Import_type;
71 PyObject *In_singleton;
72 PyObject *In_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -070073 PyObject *Interactive_type;
74 PyObject *Invert_singleton;
75 PyObject *Invert_type;
76 PyObject *IsNot_singleton;
77 PyObject *IsNot_type;
78 PyObject *Is_singleton;
79 PyObject *Is_type;
80 PyObject *JoinedStr_type;
81 PyObject *LShift_singleton;
82 PyObject *LShift_type;
83 PyObject *Lambda_type;
84 PyObject *ListComp_type;
85 PyObject *List_type;
86 PyObject *Load_singleton;
87 PyObject *Load_type;
88 PyObject *LtE_singleton;
89 PyObject *LtE_type;
90 PyObject *Lt_singleton;
91 PyObject *Lt_type;
92 PyObject *MatMult_singleton;
93 PyObject *MatMult_type;
94 PyObject *Mod_singleton;
95 PyObject *Mod_type;
96 PyObject *Module_type;
97 PyObject *Mult_singleton;
98 PyObject *Mult_type;
99 PyObject *Name_type;
100 PyObject *NamedExpr_type;
101 PyObject *Nonlocal_type;
102 PyObject *NotEq_singleton;
103 PyObject *NotEq_type;
104 PyObject *NotIn_singleton;
105 PyObject *NotIn_type;
106 PyObject *Not_singleton;
107 PyObject *Not_type;
108 PyObject *Or_singleton;
109 PyObject *Or_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700110 PyObject *Pass_type;
111 PyObject *Pow_singleton;
112 PyObject *Pow_type;
113 PyObject *RShift_singleton;
114 PyObject *RShift_type;
115 PyObject *Raise_type;
116 PyObject *Return_type;
117 PyObject *SetComp_type;
118 PyObject *Set_type;
119 PyObject *Slice_type;
120 PyObject *Starred_type;
121 PyObject *Store_singleton;
122 PyObject *Store_type;
123 PyObject *Sub_singleton;
124 PyObject *Sub_type;
125 PyObject *Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700126 PyObject *Try_type;
127 PyObject *Tuple_type;
128 PyObject *TypeIgnore_type;
129 PyObject *UAdd_singleton;
130 PyObject *UAdd_type;
131 PyObject *USub_singleton;
132 PyObject *USub_type;
133 PyObject *UnaryOp_type;
134 PyObject *While_type;
135 PyObject *With_type;
136 PyObject *YieldFrom_type;
137 PyObject *Yield_type;
138 PyObject *__dict__;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300139 PyObject *__doc__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700140 PyObject *__module__;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700141 PyObject *_attributes;
142 PyObject *_fields;
143 PyObject *alias_type;
144 PyObject *annotation;
145 PyObject *arg;
146 PyObject *arg_type;
147 PyObject *args;
148 PyObject *argtypes;
149 PyObject *arguments_type;
150 PyObject *asname;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200151 PyObject *ast;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700152 PyObject *attr;
153 PyObject *bases;
154 PyObject *body;
155 PyObject *boolop_type;
156 PyObject *cause;
157 PyObject *cmpop_type;
158 PyObject *col_offset;
159 PyObject *comparators;
160 PyObject *comprehension_type;
161 PyObject *context_expr;
162 PyObject *conversion;
163 PyObject *ctx;
164 PyObject *decorator_list;
165 PyObject *defaults;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700166 PyObject *elt;
167 PyObject *elts;
168 PyObject *end_col_offset;
169 PyObject *end_lineno;
170 PyObject *exc;
171 PyObject *excepthandler_type;
172 PyObject *expr_context_type;
173 PyObject *expr_type;
174 PyObject *finalbody;
175 PyObject *format_spec;
176 PyObject *func;
177 PyObject *generators;
178 PyObject *handlers;
179 PyObject *id;
180 PyObject *ifs;
181 PyObject *is_async;
182 PyObject *items;
183 PyObject *iter;
184 PyObject *key;
185 PyObject *keys;
186 PyObject *keyword_type;
187 PyObject *keywords;
188 PyObject *kind;
189 PyObject *kw_defaults;
190 PyObject *kwarg;
191 PyObject *kwonlyargs;
192 PyObject *left;
193 PyObject *level;
194 PyObject *lineno;
195 PyObject *lower;
196 PyObject *mod_type;
197 PyObject *module;
198 PyObject *msg;
199 PyObject *name;
200 PyObject *names;
201 PyObject *op;
202 PyObject *operand;
203 PyObject *operator_type;
204 PyObject *ops;
205 PyObject *optional_vars;
206 PyObject *orelse;
207 PyObject *posonlyargs;
208 PyObject *returns;
209 PyObject *right;
210 PyObject *simple;
211 PyObject *slice;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700212 PyObject *step;
213 PyObject *stmt_type;
214 PyObject *tag;
215 PyObject *target;
216 PyObject *targets;
217 PyObject *test;
218 PyObject *type;
219 PyObject *type_comment;
220 PyObject *type_ignore_type;
221 PyObject *type_ignores;
222 PyObject *unaryop_type;
223 PyObject *upper;
224 PyObject *value;
225 PyObject *values;
226 PyObject *vararg;
227 PyObject *withitem_type;
Victor Stinner5cf47822020-11-02 22:03:28 +0100228};
229#endif // Py_BUILD_CORE
Dino Viehlandac46eb42019-09-11 10:16:34 -0700230
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200231// Forward declaration
Victor Stinner5cf47822020-11-02 22:03:28 +0100232static int init_types(struct ast_state *state);
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200233
Victor Stinner5cf47822020-11-02 22:03:28 +0100234#ifdef Py_BUILD_CORE
235static struct ast_state*
236get_ast_state(void)
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200237{
Victor Stinner5cf47822020-11-02 22:03:28 +0100238 PyInterpreterState *interp = _PyInterpreterState_GET();
239 struct ast_state *state = &interp->ast;
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200240 if (!init_types(state)) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200241 return NULL;
242 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +0200243 return state;
Victor Stinner74419f02020-07-03 11:35:37 +0200244}
Victor Stinner5cf47822020-11-02 22:03:28 +0100245#else
246static struct ast_state global_ast_state;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700247
Victor Stinner5cf47822020-11-02 22:03:28 +0100248static struct ast_state*
249get_ast_state(void)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700250{
Victor Stinner5cf47822020-11-02 22:03:28 +0100251 struct ast_state *state = &global_ast_state;
252 if (!init_types(state)) {
253 return NULL;
254 }
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200255 return state;
256}
Victor Stinner5cf47822020-11-02 22:03:28 +0100257#endif // Py_BUILD_CORE
258
259// Include Python-ast.h after pycore_interp.h to avoid conflicts
260// with the Yield macro redefined by <winbase.h>
261#include "Python-ast.h"
262#include "structmember.h"
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200263
Victor Stinnerfd957c12020-11-03 18:07:15 +0100264void _PyAST_Fini(PyInterpreterState *interp)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200265{
Victor Stinner5cf47822020-11-02 22:03:28 +0100266#ifdef Py_BUILD_CORE
Victor Stinnerfd957c12020-11-03 18:07:15 +0100267 struct ast_state *state = &interp->ast;
Victor Stinner5cf47822020-11-02 22:03:28 +0100268#else
269 struct ast_state *state = &global_ast_state;
270#endif
271
Victor Stinner74419f02020-07-03 11:35:37 +0200272 Py_CLEAR(state->AST_type);
273 Py_CLEAR(state->Add_singleton);
274 Py_CLEAR(state->Add_type);
275 Py_CLEAR(state->And_singleton);
276 Py_CLEAR(state->And_type);
277 Py_CLEAR(state->AnnAssign_type);
278 Py_CLEAR(state->Assert_type);
279 Py_CLEAR(state->Assign_type);
280 Py_CLEAR(state->AsyncFor_type);
281 Py_CLEAR(state->AsyncFunctionDef_type);
282 Py_CLEAR(state->AsyncWith_type);
283 Py_CLEAR(state->Attribute_type);
284 Py_CLEAR(state->AugAssign_type);
285 Py_CLEAR(state->Await_type);
286 Py_CLEAR(state->BinOp_type);
287 Py_CLEAR(state->BitAnd_singleton);
288 Py_CLEAR(state->BitAnd_type);
289 Py_CLEAR(state->BitOr_singleton);
290 Py_CLEAR(state->BitOr_type);
291 Py_CLEAR(state->BitXor_singleton);
292 Py_CLEAR(state->BitXor_type);
293 Py_CLEAR(state->BoolOp_type);
294 Py_CLEAR(state->Break_type);
295 Py_CLEAR(state->Call_type);
296 Py_CLEAR(state->ClassDef_type);
297 Py_CLEAR(state->Compare_type);
298 Py_CLEAR(state->Constant_type);
299 Py_CLEAR(state->Continue_type);
300 Py_CLEAR(state->Del_singleton);
301 Py_CLEAR(state->Del_type);
302 Py_CLEAR(state->Delete_type);
303 Py_CLEAR(state->DictComp_type);
304 Py_CLEAR(state->Dict_type);
305 Py_CLEAR(state->Div_singleton);
306 Py_CLEAR(state->Div_type);
307 Py_CLEAR(state->Eq_singleton);
308 Py_CLEAR(state->Eq_type);
309 Py_CLEAR(state->ExceptHandler_type);
310 Py_CLEAR(state->Expr_type);
311 Py_CLEAR(state->Expression_type);
312 Py_CLEAR(state->FloorDiv_singleton);
313 Py_CLEAR(state->FloorDiv_type);
314 Py_CLEAR(state->For_type);
315 Py_CLEAR(state->FormattedValue_type);
316 Py_CLEAR(state->FunctionDef_type);
317 Py_CLEAR(state->FunctionType_type);
318 Py_CLEAR(state->GeneratorExp_type);
319 Py_CLEAR(state->Global_type);
320 Py_CLEAR(state->GtE_singleton);
321 Py_CLEAR(state->GtE_type);
322 Py_CLEAR(state->Gt_singleton);
323 Py_CLEAR(state->Gt_type);
324 Py_CLEAR(state->IfExp_type);
325 Py_CLEAR(state->If_type);
326 Py_CLEAR(state->ImportFrom_type);
327 Py_CLEAR(state->Import_type);
328 Py_CLEAR(state->In_singleton);
329 Py_CLEAR(state->In_type);
330 Py_CLEAR(state->Interactive_type);
331 Py_CLEAR(state->Invert_singleton);
332 Py_CLEAR(state->Invert_type);
333 Py_CLEAR(state->IsNot_singleton);
334 Py_CLEAR(state->IsNot_type);
335 Py_CLEAR(state->Is_singleton);
336 Py_CLEAR(state->Is_type);
337 Py_CLEAR(state->JoinedStr_type);
338 Py_CLEAR(state->LShift_singleton);
339 Py_CLEAR(state->LShift_type);
340 Py_CLEAR(state->Lambda_type);
341 Py_CLEAR(state->ListComp_type);
342 Py_CLEAR(state->List_type);
343 Py_CLEAR(state->Load_singleton);
344 Py_CLEAR(state->Load_type);
345 Py_CLEAR(state->LtE_singleton);
346 Py_CLEAR(state->LtE_type);
347 Py_CLEAR(state->Lt_singleton);
348 Py_CLEAR(state->Lt_type);
349 Py_CLEAR(state->MatMult_singleton);
350 Py_CLEAR(state->MatMult_type);
351 Py_CLEAR(state->Mod_singleton);
352 Py_CLEAR(state->Mod_type);
353 Py_CLEAR(state->Module_type);
354 Py_CLEAR(state->Mult_singleton);
355 Py_CLEAR(state->Mult_type);
356 Py_CLEAR(state->Name_type);
357 Py_CLEAR(state->NamedExpr_type);
358 Py_CLEAR(state->Nonlocal_type);
359 Py_CLEAR(state->NotEq_singleton);
360 Py_CLEAR(state->NotEq_type);
361 Py_CLEAR(state->NotIn_singleton);
362 Py_CLEAR(state->NotIn_type);
363 Py_CLEAR(state->Not_singleton);
364 Py_CLEAR(state->Not_type);
365 Py_CLEAR(state->Or_singleton);
366 Py_CLEAR(state->Or_type);
367 Py_CLEAR(state->Pass_type);
368 Py_CLEAR(state->Pow_singleton);
369 Py_CLEAR(state->Pow_type);
370 Py_CLEAR(state->RShift_singleton);
371 Py_CLEAR(state->RShift_type);
372 Py_CLEAR(state->Raise_type);
373 Py_CLEAR(state->Return_type);
374 Py_CLEAR(state->SetComp_type);
375 Py_CLEAR(state->Set_type);
376 Py_CLEAR(state->Slice_type);
377 Py_CLEAR(state->Starred_type);
378 Py_CLEAR(state->Store_singleton);
379 Py_CLEAR(state->Store_type);
380 Py_CLEAR(state->Sub_singleton);
381 Py_CLEAR(state->Sub_type);
382 Py_CLEAR(state->Subscript_type);
383 Py_CLEAR(state->Try_type);
384 Py_CLEAR(state->Tuple_type);
385 Py_CLEAR(state->TypeIgnore_type);
386 Py_CLEAR(state->UAdd_singleton);
387 Py_CLEAR(state->UAdd_type);
388 Py_CLEAR(state->USub_singleton);
389 Py_CLEAR(state->USub_type);
390 Py_CLEAR(state->UnaryOp_type);
391 Py_CLEAR(state->While_type);
392 Py_CLEAR(state->With_type);
393 Py_CLEAR(state->YieldFrom_type);
394 Py_CLEAR(state->Yield_type);
395 Py_CLEAR(state->__dict__);
396 Py_CLEAR(state->__doc__);
397 Py_CLEAR(state->__module__);
398 Py_CLEAR(state->_attributes);
399 Py_CLEAR(state->_fields);
400 Py_CLEAR(state->alias_type);
401 Py_CLEAR(state->annotation);
402 Py_CLEAR(state->arg);
403 Py_CLEAR(state->arg_type);
404 Py_CLEAR(state->args);
405 Py_CLEAR(state->argtypes);
406 Py_CLEAR(state->arguments_type);
407 Py_CLEAR(state->asname);
408 Py_CLEAR(state->ast);
409 Py_CLEAR(state->attr);
410 Py_CLEAR(state->bases);
411 Py_CLEAR(state->body);
412 Py_CLEAR(state->boolop_type);
413 Py_CLEAR(state->cause);
414 Py_CLEAR(state->cmpop_type);
415 Py_CLEAR(state->col_offset);
416 Py_CLEAR(state->comparators);
417 Py_CLEAR(state->comprehension_type);
418 Py_CLEAR(state->context_expr);
419 Py_CLEAR(state->conversion);
420 Py_CLEAR(state->ctx);
421 Py_CLEAR(state->decorator_list);
422 Py_CLEAR(state->defaults);
423 Py_CLEAR(state->elt);
424 Py_CLEAR(state->elts);
425 Py_CLEAR(state->end_col_offset);
426 Py_CLEAR(state->end_lineno);
427 Py_CLEAR(state->exc);
428 Py_CLEAR(state->excepthandler_type);
429 Py_CLEAR(state->expr_context_type);
430 Py_CLEAR(state->expr_type);
431 Py_CLEAR(state->finalbody);
432 Py_CLEAR(state->format_spec);
433 Py_CLEAR(state->func);
434 Py_CLEAR(state->generators);
435 Py_CLEAR(state->handlers);
436 Py_CLEAR(state->id);
437 Py_CLEAR(state->ifs);
438 Py_CLEAR(state->is_async);
439 Py_CLEAR(state->items);
440 Py_CLEAR(state->iter);
441 Py_CLEAR(state->key);
442 Py_CLEAR(state->keys);
443 Py_CLEAR(state->keyword_type);
444 Py_CLEAR(state->keywords);
445 Py_CLEAR(state->kind);
446 Py_CLEAR(state->kw_defaults);
447 Py_CLEAR(state->kwarg);
448 Py_CLEAR(state->kwonlyargs);
449 Py_CLEAR(state->left);
450 Py_CLEAR(state->level);
451 Py_CLEAR(state->lineno);
452 Py_CLEAR(state->lower);
453 Py_CLEAR(state->mod_type);
454 Py_CLEAR(state->module);
455 Py_CLEAR(state->msg);
456 Py_CLEAR(state->name);
457 Py_CLEAR(state->names);
458 Py_CLEAR(state->op);
459 Py_CLEAR(state->operand);
460 Py_CLEAR(state->operator_type);
461 Py_CLEAR(state->ops);
462 Py_CLEAR(state->optional_vars);
463 Py_CLEAR(state->orelse);
464 Py_CLEAR(state->posonlyargs);
465 Py_CLEAR(state->returns);
466 Py_CLEAR(state->right);
467 Py_CLEAR(state->simple);
468 Py_CLEAR(state->slice);
469 Py_CLEAR(state->step);
470 Py_CLEAR(state->stmt_type);
471 Py_CLEAR(state->tag);
472 Py_CLEAR(state->target);
473 Py_CLEAR(state->targets);
474 Py_CLEAR(state->test);
475 Py_CLEAR(state->type);
476 Py_CLEAR(state->type_comment);
477 Py_CLEAR(state->type_ignore_type);
478 Py_CLEAR(state->type_ignores);
479 Py_CLEAR(state->unaryop_type);
480 Py_CLEAR(state->upper);
481 Py_CLEAR(state->value);
482 Py_CLEAR(state->values);
483 Py_CLEAR(state->vararg);
484 Py_CLEAR(state->withitem_type);
Dino Viehlandac46eb42019-09-11 10:16:34 -0700485
Victor Stinnerfd957c12020-11-03 18:07:15 +0100486#if defined(Py_BUILD_CORE) && !defined(NDEBUG)
487 state->initialized = -1;
488#else
Victor Stinnere5fbe0c2020-09-15 18:03:34 +0200489 state->initialized = 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +0100490#endif
Dino Viehlandac46eb42019-09-11 10:16:34 -0700491}
492
Victor Stinner5cf47822020-11-02 22:03:28 +0100493static int init_identifiers(struct ast_state *state)
Dino Viehlandac46eb42019-09-11 10:16:34 -0700494{
Dino Viehlandac46eb42019-09-11 10:16:34 -0700495 if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0;
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +0300496 if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700497 if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700498 if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0;
499 if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0;
500 if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0;
501 if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0;
502 if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0;
503 if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0;
504 if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0;
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200505 if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700506 if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0;
507 if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0;
508 if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0;
509 if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0;
510 if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0;
511 if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0;
512 if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0;
513 if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0;
514 if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0;
515 if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0;
516 if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0;
Dino Viehlandac46eb42019-09-11 10:16:34 -0700517 if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0;
518 if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0;
519 if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0;
520 if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0;
521 if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0;
522 if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0;
523 if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0;
524 if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0;
525 if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0;
526 if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0;
527 if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0;
528 if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0;
529 if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0;
530 if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0;
531 if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0;
532 if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0;
533 if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0;
534 if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0;
535 if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0;
536 if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0;
537 if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0;
538 if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0;
539 if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0;
540 if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0;
541 if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0;
542 if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0;
543 if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0;
544 if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0;
545 if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0;
546 if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0;
547 if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0;
548 if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0;
549 if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0;
550 if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0;
551 if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0;
552 if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0;
553 if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0;
554 if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0;
555 if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0;
556 if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0;
557 if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0;
558 if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0;
559 if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0;
560 if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0;
561 if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0;
562 if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0;
563 if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0;
564 if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0;
565 if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0;
566 if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0;
567 if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0;
568 if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0;
569 return 1;
570};
571
Pablo Galindoa5634c42020-09-16 19:42:00 +0100572GENERATE_ASDL_SEQ_CONSTRUCTOR(mod, mod_ty)
573GENERATE_ASDL_SEQ_CONSTRUCTOR(stmt, stmt_ty)
574GENERATE_ASDL_SEQ_CONSTRUCTOR(expr, expr_ty)
575GENERATE_ASDL_SEQ_CONSTRUCTOR(comprehension, comprehension_ty)
576GENERATE_ASDL_SEQ_CONSTRUCTOR(excepthandler, excepthandler_ty)
577GENERATE_ASDL_SEQ_CONSTRUCTOR(arguments, arguments_ty)
578GENERATE_ASDL_SEQ_CONSTRUCTOR(arg, arg_ty)
579GENERATE_ASDL_SEQ_CONSTRUCTOR(keyword, keyword_ty)
580GENERATE_ASDL_SEQ_CONSTRUCTOR(alias, alias_ty)
581GENERATE_ASDL_SEQ_CONSTRUCTOR(withitem, withitem_ty)
582GENERATE_ASDL_SEQ_CONSTRUCTOR(type_ignore, type_ignore_ty)
583
Victor Stinner5cf47822020-11-02 22:03:28 +0100584static PyObject* ast2obj_mod(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300585static const char * const Module_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200586 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800587 "type_ignores",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000588};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300589static const char * const Interactive_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200590 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000591};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300592static const char * const Expression_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200593 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000594};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300595static const char * const FunctionType_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800596 "argtypes",
597 "returns",
598};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300599static const char * const stmt_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200600 "lineno",
601 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000602 "end_lineno",
603 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000604};
Victor Stinner5cf47822020-11-02 22:03:28 +0100605static PyObject* ast2obj_stmt(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300606static const char * const FunctionDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200607 "name",
608 "args",
609 "body",
610 "decorator_list",
611 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800612 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000613};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300614static const char * const AsyncFunctionDef_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400615 "name",
616 "args",
617 "body",
618 "decorator_list",
619 "returns",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800620 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400621};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300622static const char * const ClassDef_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200623 "name",
624 "bases",
625 "keywords",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200626 "body",
627 "decorator_list",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000628};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300629static const char * const Return_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200630 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000631};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300632static const char * const Delete_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200633 "targets",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000634};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300635static const char * const Assign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200636 "targets",
637 "value",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800638 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000639};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300640static const char * const AugAssign_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200641 "target",
642 "op",
643 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000644};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300645static const char * const AnnAssign_fields[]={
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700646 "target",
647 "annotation",
648 "value",
649 "simple",
650};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300651static const char * const For_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200652 "target",
653 "iter",
654 "body",
655 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800656 "type_comment",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000657};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300658static const char * const AsyncFor_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400659 "target",
660 "iter",
661 "body",
662 "orelse",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800663 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400664};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300665static const char * const While_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200666 "test",
667 "body",
668 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000669};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300670static const char * const If_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200671 "test",
672 "body",
673 "orelse",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000674};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300675static const char * const With_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200676 "items",
677 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800678 "type_comment",
Guido van Rossumc2e20742006-02-27 22:32:47 +0000679};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300680static const char * const AsyncWith_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400681 "items",
682 "body",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800683 "type_comment",
Yury Selivanov75445082015-05-11 22:57:16 -0400684};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300685static const char * const Raise_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200686 "exc",
687 "cause",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000688};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300689static const char * const Try_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200690 "body",
691 "handlers",
692 "orelse",
693 "finalbody",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000694};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300695static const char * const Assert_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200696 "test",
697 "msg",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000698};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300699static const char * const Import_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200700 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000701};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300702static const char * const ImportFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200703 "module",
704 "names",
705 "level",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000706};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300707static const char * const Global_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200708 "names",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000709};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300710static const char * const Nonlocal_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200711 "names",
Jeremy Hylton81e95022007-02-27 06:50:52 +0000712};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300713static const char * const Expr_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200714 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000715};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300716static const char * const expr_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200717 "lineno",
718 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000719 "end_lineno",
720 "end_col_offset",
Martin v. Löwis577b5b92006-02-27 15:23:19 +0000721};
Victor Stinner5cf47822020-11-02 22:03:28 +0100722static PyObject* ast2obj_expr(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300723static const char * const BoolOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200724 "op",
725 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000726};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300727static const char * const NamedExpr_fields[]={
Emily Morehouse8f59ee02019-01-24 16:49:56 -0700728 "target",
729 "value",
730};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300731static const char * const BinOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200732 "left",
733 "op",
734 "right",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000735};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300736static const char * const UnaryOp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200737 "op",
738 "operand",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000739};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300740static const char * const Lambda_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200741 "args",
742 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000743};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300744static const char * const IfExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200745 "test",
746 "body",
747 "orelse",
Thomas Woutersdca3b9c2006-02-27 00:24:13 +0000748};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300749static const char * const Dict_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200750 "keys",
751 "values",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000752};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300753static const char * const Set_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200754 "elts",
Guido van Rossum86e58e22006-08-28 15:27:34 +0000755};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300756static const char * const ListComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200757 "elt",
758 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000759};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300760static const char * const SetComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200761 "elt",
762 "generators",
Nick Coghlan650f0d02007-04-15 12:05:43 +0000763};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300764static const char * const DictComp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200765 "key",
766 "value",
767 "generators",
Guido van Rossum992d4a32007-07-11 13:09:30 +0000768};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300769static const char * const GeneratorExp_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200770 "elt",
771 "generators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000772};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300773static const char * const Await_fields[]={
Yury Selivanov75445082015-05-11 22:57:16 -0400774 "value",
775};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300776static const char * const Yield_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200777 "value",
Benjamin Peterson527c6222012-01-14 08:58:23 -0500778};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300779static const char * const YieldFrom_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200780 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000781};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300782static const char * const Compare_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200783 "left",
784 "ops",
785 "comparators",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000786};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300787static const char * const Call_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200788 "func",
789 "args",
790 "keywords",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000791};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300792static const char * const FormattedValue_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400793 "value",
794 "conversion",
795 "format_spec",
796};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300797static const char * const JoinedStr_fields[]={
Eric V. Smith235a6f02015-09-19 14:51:32 -0400798 "values",
799};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300800static const char * const Constant_fields[]={
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100801 "value",
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700802 "kind",
Victor Stinnerf2c1aa12016-01-26 00:40:57 +0100803};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300804static const char * const Attribute_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200805 "value",
806 "attr",
807 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000808};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300809static const char * const Subscript_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200810 "value",
811 "slice",
812 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000813};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300814static const char * const Starred_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200815 "value",
816 "ctx",
Guido van Rossum0368b722007-05-11 16:50:42 +0000817};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300818static const char * const Name_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200819 "id",
820 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000821};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300822static const char * const List_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200823 "elts",
824 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000825};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300826static const char * const Tuple_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200827 "elts",
828 "ctx",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000829};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300830static const char * const Slice_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200831 "lower",
832 "upper",
833 "step",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000834};
Victor Stinner5cf47822020-11-02 22:03:28 +0100835static PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty);
836static PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty);
837static PyObject* ast2obj_operator(struct ast_state *state, operator_ty);
838static PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty);
839static PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty);
840static PyObject* ast2obj_comprehension(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300841static const char * const comprehension_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200842 "target",
843 "iter",
844 "ifs",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700845 "is_async",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000846};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300847static const char * const excepthandler_attributes[] = {
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200848 "lineno",
849 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000850 "end_lineno",
851 "end_col_offset",
Neal Norwitzad74aa82008-03-31 05:14:30 +0000852};
Victor Stinner5cf47822020-11-02 22:03:28 +0100853static PyObject* ast2obj_excepthandler(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300854static const char * const ExceptHandler_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200855 "type",
856 "name",
857 "body",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000858};
Victor Stinner5cf47822020-11-02 22:03:28 +0100859static PyObject* ast2obj_arguments(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300860static const char * const arguments_fields[]={
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100861 "posonlyargs",
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200862 "args",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200863 "vararg",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200864 "kwonlyargs",
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200865 "kw_defaults",
Victor Stinneree4b59c2013-07-27 00:01:35 +0200866 "kwarg",
867 "defaults",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000868};
Victor Stinner5cf47822020-11-02 22:03:28 +0100869static PyObject* ast2obj_arg(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300870static const char * const arg_attributes[] = {
Victor Stinneree4b59c2013-07-27 00:01:35 +0200871 "lineno",
872 "col_offset",
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000873 "end_lineno",
874 "end_col_offset",
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700875};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300876static const char * const arg_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200877 "arg",
878 "annotation",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800879 "type_comment",
Neal Norwitzc1505362006-12-28 06:47:50 +0000880};
Victor Stinner5cf47822020-11-02 22:03:28 +0100881static PyObject* ast2obj_keyword(struct ast_state *state, void*);
Pablo Galindo168660b2020-04-02 00:47:39 +0100882static const char * const keyword_attributes[] = {
883 "lineno",
884 "col_offset",
885 "end_lineno",
886 "end_col_offset",
887};
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300888static const char * const keyword_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200889 "arg",
890 "value",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000891};
Victor Stinner5cf47822020-11-02 22:03:28 +0100892static PyObject* ast2obj_alias(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300893static const char * const alias_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200894 "name",
895 "asname",
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000896};
Victor Stinner5cf47822020-11-02 22:03:28 +0100897static PyObject* ast2obj_withitem(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300898static const char * const withitem_fields[]={
Victor Stinnerce72e1c2013-07-27 00:00:36 +0200899 "context_expr",
900 "optional_vars",
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500901};
Victor Stinner5cf47822020-11-02 22:03:28 +0100902static PyObject* ast2obj_type_ignore(struct ast_state *state, void*);
Serhiy Storchaka43c97312019-09-10 13:02:30 +0300903static const char * const TypeIgnore_fields[]={
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800904 "lineno",
Michael J. Sullivan933e1502019-05-22 07:54:20 -0700905 "tag",
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800906};
Martin v. Löwisbd260da2006-02-26 19:42:26 +0000907
908
INADA Naokifc489082017-01-25 22:33:43 +0900909
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700910typedef struct {
Victor Stinner45e50de2012-03-13 01:17:31 +0100911 PyObject_HEAD
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700912 PyObject *dict;
913} AST_object;
914
Benjamin Peterson1767e022012-03-14 21:50:29 -0500915static void
916ast_dealloc(AST_object *self)
917{
INADA Naokia6296d32017-08-24 14:55:17 +0900918 /* bpo-31095: UnTrack is needed before calling any callbacks */
Eddie Elizondo0247e802019-09-14 09:38:17 -0400919 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +0900920 PyObject_GC_UnTrack(self);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500921 Py_CLEAR(self->dict);
Eddie Elizondo0247e802019-09-14 09:38:17 -0400922 freefunc free_func = PyType_GetSlot(tp, Py_tp_free);
923 assert(free_func != NULL);
924 free_func(self);
925 Py_DECREF(tp);
Benjamin Peterson1767e022012-03-14 21:50:29 -0500926}
927
Neal Norwitz207c9f32008-03-31 04:42:11 +0000928static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700929ast_traverse(AST_object *self, visitproc visit, void *arg)
930{
Pablo Galindo1cf15af2020-05-27 10:03:38 +0100931 Py_VISIT(Py_TYPE(self));
Benjamin Peterson81071762012-07-08 11:03:46 -0700932 Py_VISIT(self->dict);
933 return 0;
934}
935
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300936static int
Benjamin Peterson81071762012-07-08 11:03:46 -0700937ast_clear(AST_object *self)
938{
939 Py_CLEAR(self->dict);
Serhiy Storchakaa5c42282018-05-31 07:34:34 +0300940 return 0;
Benjamin Peterson81071762012-07-08 11:03:46 -0700941}
942
943static int
Neal Norwitz207c9f32008-03-31 04:42:11 +0000944ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
945{
Victor Stinner5cf47822020-11-02 22:03:28 +0100946 struct ast_state *state = get_ast_state();
Victor Stinner1f764532020-07-04 23:18:15 +0200947 if (state == NULL) {
948 return -1;
949 }
950
Neal Norwitz207c9f32008-03-31 04:42:11 +0000951 Py_ssize_t i, numfields = 0;
952 int res = -1;
953 PyObject *key, *value, *fields;
Victor Stinner74419f02020-07-03 11:35:37 +0200954 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200955 goto cleanup;
956 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000957 if (fields) {
958 numfields = PySequence_Size(fields);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200959 if (numfields == -1) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000960 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200961 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000962 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900963
Neal Norwitz207c9f32008-03-31 04:42:11 +0000964 res = 0; /* if no error occurs, this stays 0 to the end */
INADA Naoki4c78c522017-02-24 02:48:17 +0900965 if (numfields < PyTuple_GET_SIZE(args)) {
966 PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most "
967 "%zd positional argument%s",
Dino Viehlandac46eb42019-09-11 10:16:34 -0700968 _PyType_Name(Py_TYPE(self)),
INADA Naoki4c78c522017-02-24 02:48:17 +0900969 numfields, numfields == 1 ? "" : "s");
970 res = -1;
971 goto cleanup;
972 }
973 for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
974 /* cannot be reached when fields is NULL */
975 PyObject *name = PySequence_GetItem(fields, i);
976 if (!name) {
Neal Norwitz207c9f32008-03-31 04:42:11 +0000977 res = -1;
978 goto cleanup;
979 }
INADA Naoki4c78c522017-02-24 02:48:17 +0900980 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
981 Py_DECREF(name);
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200982 if (res < 0) {
INADA Naoki4c78c522017-02-24 02:48:17 +0900983 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200984 }
Neal Norwitz207c9f32008-03-31 04:42:11 +0000985 }
986 if (kw) {
987 i = 0; /* needed by PyDict_Next */
988 while (PyDict_Next(kw, &i, &key, &value)) {
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200989 int contains = PySequence_Contains(fields, key);
990 if (contains == -1) {
991 res = -1;
Neal Norwitz207c9f32008-03-31 04:42:11 +0000992 goto cleanup;
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200993 } else if (contains == 1) {
994 Py_ssize_t p = PySequence_Index(fields, key);
995 if (p == -1) {
996 res = -1;
997 goto cleanup;
998 }
999 if (p < PyTuple_GET_SIZE(args)) {
1000 PyErr_Format(PyExc_TypeError,
1001 "%.400s got multiple values for argument '%U'",
1002 Py_TYPE(self)->tp_name, key);
1003 res = -1;
1004 goto cleanup;
1005 }
1006 }
1007 res = PyObject_SetAttr(self, key, value);
1008 if (res < 0) {
1009 goto cleanup;
1010 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001011 }
1012 }
1013 cleanup:
1014 Py_XDECREF(fields);
1015 return res;
1016}
1017
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001018/* Pickling support */
1019static PyObject *
1020ast_type_reduce(PyObject *self, PyObject *unused)
1021{
Victor Stinner5cf47822020-11-02 22:03:28 +01001022 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02001023 if (state == NULL) {
1024 return NULL;
1025 }
1026
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001027 PyObject *dict;
Victor Stinner74419f02020-07-03 11:35:37 +02001028 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001029 return NULL;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001030 }
1031 if (dict) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001032 return Py_BuildValue("O()N", Py_TYPE(self), dict);
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001033 }
1034 return Py_BuildValue("O()", Py_TYPE(self));
1035}
1036
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001037static PyMemberDef ast_type_members[] = {
1038 {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY},
1039 {NULL} /* Sentinel */
1040};
1041
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001042static PyMethodDef ast_type_methods[] = {
1043 {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
1044 {NULL}
1045};
1046
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001047static PyGetSetDef ast_type_getsets[] = {
1048 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
1049 {NULL}
1050};
1051
Dino Viehlandac46eb42019-09-11 10:16:34 -07001052static PyType_Slot AST_type_slots[] = {
1053 {Py_tp_dealloc, ast_dealloc},
1054 {Py_tp_getattro, PyObject_GenericGetAttr},
1055 {Py_tp_setattro, PyObject_GenericSetAttr},
1056 {Py_tp_traverse, ast_traverse},
1057 {Py_tp_clear, ast_clear},
Eddie Elizondo3368f3c2019-09-19 09:29:05 -07001058 {Py_tp_members, ast_type_members},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001059 {Py_tp_methods, ast_type_methods},
1060 {Py_tp_getset, ast_type_getsets},
1061 {Py_tp_init, ast_type_init},
1062 {Py_tp_alloc, PyType_GenericAlloc},
1063 {Py_tp_new, PyType_GenericNew},
Dino Viehlandac46eb42019-09-11 10:16:34 -07001064 {Py_tp_free, PyObject_GC_Del},
1065 {0, 0},
1066};
1067
1068static PyType_Spec AST_type_spec = {
Serhiy Storchakabace59d2020-03-22 20:33:34 +02001069 "ast.AST",
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -07001070 sizeof(AST_object),
Neal Norwitz207c9f32008-03-31 04:42:11 +00001071 0,
Dino Viehlandac46eb42019-09-11 10:16:34 -07001072 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1073 AST_type_slots
Neal Norwitz207c9f32008-03-31 04:42:11 +00001074};
1075
Dino Viehlandac46eb42019-09-11 10:16:34 -07001076static PyObject *
Victor Stinner5cf47822020-11-02 22:03:28 +01001077make_type(struct ast_state *state, const char *type, PyObject* base,
Victor Stinner74419f02020-07-03 11:35:37 +02001078 const char* const* fields, int num_fields, const char *doc)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001079{
1080 PyObject *fnames, *result;
1081 int i;
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001082 fnames = PyTuple_New(num_fields);
1083 if (!fnames) return NULL;
1084 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001085 PyObject *field = PyUnicode_InternFromString(fields[i]);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001086 if (!field) {
1087 Py_DECREF(fnames);
1088 return NULL;
1089 }
1090 PyTuple_SET_ITEM(fnames, i, field);
1091 }
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001092 result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}",
INADA Naokifc489082017-01-25 22:33:43 +09001093 type, base,
Victor Stinner74419f02020-07-03 11:35:37 +02001094 state->_fields, fnames,
1095 state->__module__,
1096 state->ast,
1097 state->__doc__, doc);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001098 Py_DECREF(fnames);
Dino Viehlandac46eb42019-09-11 10:16:34 -07001099 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001100}
1101
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001102static int
Victor Stinner5cf47822020-11-02 22:03:28 +01001103add_attributes(struct ast_state *state, PyObject *type, const char * const *attrs, int num_fields)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001104{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001105 int i, result;
Neal Norwitz207c9f32008-03-31 04:42:11 +00001106 PyObject *s, *l = PyTuple_New(num_fields);
Benjamin Peterson3e5cd1d2010-06-27 21:45:24 +00001107 if (!l)
1108 return 0;
1109 for (i = 0; i < num_fields; i++) {
Serhiy Storchaka43c97312019-09-10 13:02:30 +03001110 s = PyUnicode_InternFromString(attrs[i]);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001111 if (!s) {
1112 Py_DECREF(l);
1113 return 0;
1114 }
Neal Norwitz207c9f32008-03-31 04:42:11 +00001115 PyTuple_SET_ITEM(l, i, s);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001116 }
Victor Stinner74419f02020-07-03 11:35:37 +02001117 result = PyObject_SetAttr(type, state->_attributes, l) >= 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001118 Py_DECREF(l);
1119 return result;
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001120}
1121
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001122/* Conversion AST -> Python */
1123
Victor Stinner5cf47822020-11-02 22:03:28 +01001124static 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 +00001125{
Benjamin Peterson77fa9372012-05-15 10:10:27 -07001126 Py_ssize_t i, n = asdl_seq_LEN(seq);
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001127 PyObject *result = PyList_New(n);
1128 PyObject *value;
1129 if (!result)
1130 return NULL;
1131 for (i = 0; i < n; i++) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01001132 value = func(state, asdl_seq_GET_UNTYPED(seq, i));
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001133 if (!value) {
1134 Py_DECREF(result);
1135 return NULL;
1136 }
1137 PyList_SET_ITEM(result, i, value);
1138 }
1139 return result;
1140}
1141
Victor Stinner5cf47822020-11-02 22:03:28 +01001142static PyObject* ast2obj_object(struct ast_state *Py_UNUSED(state), void *o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001143{
1144 if (!o)
1145 o = Py_None;
1146 Py_INCREF((PyObject*)o);
1147 return (PyObject*)o;
1148}
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001149#define ast2obj_constant ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001150#define ast2obj_identifier ast2obj_object
1151#define ast2obj_string ast2obj_object
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001152
Victor Stinner5cf47822020-11-02 22:03:28 +01001153static PyObject* ast2obj_int(struct ast_state *Py_UNUSED(state), long b)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001154{
Christian Heimes217cfd12007-12-02 14:31:20 +00001155 return PyLong_FromLong(b);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00001156}
1157
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001158/* Conversion Python -> AST */
1159
Victor Stinner5cf47822020-11-02 22:03:28 +01001160static int obj2ast_object(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001161{
1162 if (obj == Py_None)
1163 obj = NULL;
Christian Heimes70c94e72013-07-27 00:33:13 +02001164 if (obj) {
1165 if (PyArena_AddPyObject(arena, obj) < 0) {
1166 *out = NULL;
1167 return -1;
1168 }
1169 Py_INCREF(obj);
1170 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001171 *out = obj;
1172 return 0;
1173}
1174
Victor Stinner5cf47822020-11-02 22:03:28 +01001175static int obj2ast_constant(struct ast_state *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001176{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001177 if (PyArena_AddPyObject(arena, obj) < 0) {
1178 *out = NULL;
1179 return -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001180 }
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001181 Py_INCREF(obj);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001182 *out = obj;
1183 return 0;
1184}
1185
Victor Stinner5cf47822020-11-02 22:03:28 +01001186static int obj2ast_identifier(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001187{
Benjamin Peterson180e6352011-07-22 11:09:07 -05001188 if (!PyUnicode_CheckExact(obj) && obj != Py_None) {
1189 PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str");
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001190 return 1;
1191 }
Victor Stinner74419f02020-07-03 11:35:37 +02001192 return obj2ast_object(state, obj, out, arena);
Benjamin Peterson2193d2b2011-07-22 10:50:23 -05001193}
1194
Victor Stinner5cf47822020-11-02 22:03:28 +01001195static int obj2ast_string(struct ast_state *state, PyObject* obj, PyObject** out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001196{
1197 if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) {
1198 PyErr_SetString(PyExc_TypeError, "AST string must be of type str");
1199 return 1;
1200 }
Victor Stinner74419f02020-07-03 11:35:37 +02001201 return obj2ast_object(state, obj, out, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001202}
1203
Victor Stinner5cf47822020-11-02 22:03:28 +01001204static int obj2ast_int(struct ast_state* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001205{
1206 int i;
1207 if (!PyLong_Check(obj)) {
Amaury Forgeot d'Arc5e8f8102011-11-22 21:52:30 +01001208 PyErr_Format(PyExc_ValueError, "invalid integer value: %R", obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001209 return 1;
1210 }
1211
Serhiy Storchaka56f6e762015-09-06 21:25:30 +03001212 i = _PyLong_AsInt(obj);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001213 if (i == -1 && PyErr_Occurred())
1214 return 1;
1215 *out = i;
1216 return 0;
1217}
1218
Victor Stinner5cf47822020-11-02 22:03:28 +01001219static int add_ast_fields(struct ast_state *state)
Benjamin Petersonce825f12008-10-24 23:11:02 +00001220{
Dino Viehlandac46eb42019-09-11 10:16:34 -07001221 PyObject *empty_tuple;
Benjamin Petersonce825f12008-10-24 23:11:02 +00001222 empty_tuple = PyTuple_New(0);
1223 if (!empty_tuple ||
Victor Stinner74419f02020-07-03 11:35:37 +02001224 PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 ||
1225 PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) {
Benjamin Petersonce825f12008-10-24 23:11:02 +00001226 Py_XDECREF(empty_tuple);
1227 return -1;
1228 }
1229 Py_DECREF(empty_tuple);
1230 return 0;
1231}
1232
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001233
Victor Stinnerfd957c12020-11-03 18:07:15 +01001234
1235static int
1236init_types(struct ast_state *state)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001237{
Victor Stinnerfd957c12020-11-03 18:07:15 +01001238 // init_types() must not be called after _PyAST_Fini()
1239 // has been called
1240 assert(state->initialized >= 0);
1241
1242 if (state->initialized) {
1243 return 1;
1244 }
1245 if (init_identifiers(state) < 0) {
1246 return 0;
1247 }
Dino Viehlandac46eb42019-09-11 10:16:34 -07001248 state->AST_type = PyType_FromSpec(&AST_type_spec);
Victor Stinnerfd957c12020-11-03 18:07:15 +01001249 if (!state->AST_type) {
1250 return 0;
1251 }
1252 if (add_ast_fields(state) < 0) {
1253 return 0;
1254 }
Victor Stinner74419f02020-07-03 11:35:37 +02001255 state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001256 "mod = Module(stmt* body, type_ignore* type_ignores)\n"
1257 " | Interactive(stmt* body)\n"
1258 " | Expression(expr body)\n"
1259 " | FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001260 if (!state->mod_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001261 if (!add_attributes(state, state->mod_type, NULL, 0)) return 0;
1262 state->Module_type = make_type(state, "Module", state->mod_type,
1263 Module_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001264 "Module(stmt* body, type_ignore* type_ignores)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001265 if (!state->Module_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001266 state->Interactive_type = make_type(state, "Interactive", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001267 Interactive_fields, 1,
1268 "Interactive(stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001269 if (!state->Interactive_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001270 state->Expression_type = make_type(state, "Expression", state->mod_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001271 Expression_fields, 1,
1272 "Expression(expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001273 if (!state->Expression_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001274 state->FunctionType_type = make_type(state, "FunctionType",
1275 state->mod_type, FunctionType_fields,
1276 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001277 "FunctionType(expr* argtypes, expr returns)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001278 if (!state->FunctionType_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001279 state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001280 "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1281 " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n"
1282 " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n"
1283 " | Return(expr? value)\n"
1284 " | Delete(expr* targets)\n"
1285 " | Assign(expr* targets, expr value, string? type_comment)\n"
1286 " | AugAssign(expr target, operator op, expr value)\n"
1287 " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n"
1288 " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1289 " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n"
1290 " | While(expr test, stmt* body, stmt* orelse)\n"
1291 " | If(expr test, stmt* body, stmt* orelse)\n"
1292 " | With(withitem* items, stmt* body, string? type_comment)\n"
1293 " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n"
1294 " | Raise(expr? exc, expr? cause)\n"
1295 " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n"
1296 " | Assert(expr test, expr? msg)\n"
1297 " | Import(alias* names)\n"
1298 " | ImportFrom(identifier? module, alias* names, int? level)\n"
1299 " | Global(identifier* names)\n"
1300 " | Nonlocal(identifier* names)\n"
1301 " | Expr(expr value)\n"
1302 " | Pass\n"
1303 " | Break\n"
1304 " | Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001305 if (!state->stmt_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001306 if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001307 if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1)
1308 return 0;
1309 if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) ==
1310 -1)
1311 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001312 state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001313 FunctionDef_fields, 6,
1314 "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001315 if (!state->FunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001316 if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) ==
1317 -1)
1318 return 0;
1319 if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None)
1320 == -1)
1321 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001322 state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001323 state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001324 AsyncFunctionDef_fields, 6,
1325 "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001326 if (!state->AsyncFunctionDef_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001327 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None)
1328 == -1)
1329 return 0;
1330 if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment,
1331 Py_None) == -1)
1332 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001333 state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001334 ClassDef_fields, 5,
1335 "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001336 if (!state->ClassDef_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001337 state->Return_type = make_type(state, "Return", state->stmt_type,
1338 Return_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001339 "Return(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001340 if (!state->Return_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001341 if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1)
1342 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001343 state->Delete_type = make_type(state, "Delete", state->stmt_type,
1344 Delete_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001345 "Delete(expr* targets)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001346 if (!state->Delete_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001347 state->Assign_type = make_type(state, "Assign", state->stmt_type,
1348 Assign_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001349 "Assign(expr* targets, expr value, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001350 if (!state->Assign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001351 if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) ==
1352 -1)
1353 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001354 state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001355 AugAssign_fields, 3,
1356 "AugAssign(expr target, operator op, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001357 if (!state->AugAssign_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001358 state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001359 AnnAssign_fields, 4,
1360 "AnnAssign(expr target, expr annotation, expr? value, int simple)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001361 if (!state->AnnAssign_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001362 if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1)
1363 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001364 state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001365 "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001366 if (!state->For_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001367 if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1)
1368 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001369 state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001370 AsyncFor_fields, 5,
1371 "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001372 if (!state->AsyncFor_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001373 if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) ==
1374 -1)
1375 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001376 state->While_type = make_type(state, "While", state->stmt_type,
1377 While_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001378 "While(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001379 if (!state->While_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001380 state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001381 "If(expr test, stmt* body, stmt* orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001382 if (!state->If_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001383 state->With_type = make_type(state, "With", state->stmt_type, With_fields,
1384 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001385 "With(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001386 if (!state->With_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001387 if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1)
1388 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001389 state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001390 AsyncWith_fields, 3,
1391 "AsyncWith(withitem* items, stmt* body, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001392 if (!state->AsyncWith_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001393 if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None)
1394 == -1)
1395 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001396 state->Raise_type = make_type(state, "Raise", state->stmt_type,
1397 Raise_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001398 "Raise(expr? exc, expr? cause)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001399 if (!state->Raise_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001400 if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1)
1401 return 0;
1402 if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1)
1403 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001404 state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001405 "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001406 if (!state->Try_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001407 state->Assert_type = make_type(state, "Assert", state->stmt_type,
1408 Assert_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001409 "Assert(expr test, expr? msg)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001410 if (!state->Assert_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001411 if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1)
1412 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001413 state->Import_type = make_type(state, "Import", state->stmt_type,
1414 Import_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001415 "Import(alias* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001416 if (!state->Import_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001417 state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001418 ImportFrom_fields, 3,
1419 "ImportFrom(identifier? module, alias* names, int? level)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001420 if (!state->ImportFrom_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001421 if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1)
1422 return 0;
1423 if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1)
1424 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001425 state->Global_type = make_type(state, "Global", state->stmt_type,
1426 Global_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001427 "Global(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001428 if (!state->Global_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001429 state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001430 Nonlocal_fields, 1,
1431 "Nonlocal(identifier* names)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001432 if (!state->Nonlocal_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001433 state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields,
1434 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001435 "Expr(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001436 if (!state->Expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001437 state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001438 "Pass");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001439 if (!state->Pass_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001440 state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001441 "Break");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001442 if (!state->Break_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001443 state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL,
1444 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001445 "Continue");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001446 if (!state->Continue_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001447 state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001448 "expr = BoolOp(boolop op, expr* values)\n"
1449 " | NamedExpr(expr target, expr value)\n"
1450 " | BinOp(expr left, operator op, expr right)\n"
1451 " | UnaryOp(unaryop op, expr operand)\n"
1452 " | Lambda(arguments args, expr body)\n"
1453 " | IfExp(expr test, expr body, expr orelse)\n"
1454 " | Dict(expr* keys, expr* values)\n"
1455 " | Set(expr* elts)\n"
1456 " | ListComp(expr elt, comprehension* generators)\n"
1457 " | SetComp(expr elt, comprehension* generators)\n"
1458 " | DictComp(expr key, expr value, comprehension* generators)\n"
1459 " | GeneratorExp(expr elt, comprehension* generators)\n"
1460 " | Await(expr value)\n"
1461 " | Yield(expr? value)\n"
1462 " | YieldFrom(expr value)\n"
1463 " | Compare(expr left, cmpop* ops, expr* comparators)\n"
1464 " | Call(expr func, expr* args, keyword* keywords)\n"
1465 " | FormattedValue(expr value, int? conversion, expr? format_spec)\n"
1466 " | JoinedStr(expr* values)\n"
1467 " | Constant(constant value, string? kind)\n"
1468 " | Attribute(expr value, identifier attr, expr_context ctx)\n"
1469 " | Subscript(expr value, expr slice, expr_context ctx)\n"
1470 " | Starred(expr value, expr_context ctx)\n"
1471 " | Name(identifier id, expr_context ctx)\n"
1472 " | List(expr* elts, expr_context ctx)\n"
1473 " | Tuple(expr* elts, expr_context ctx)\n"
1474 " | Slice(expr? lower, expr? upper, expr? step)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001475 if (!state->expr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001476 if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001477 if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1)
1478 return 0;
1479 if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) ==
1480 -1)
1481 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001482 state->BoolOp_type = make_type(state, "BoolOp", state->expr_type,
1483 BoolOp_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001484 "BoolOp(boolop op, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001485 if (!state->BoolOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001486 state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001487 NamedExpr_fields, 2,
1488 "NamedExpr(expr target, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001489 if (!state->NamedExpr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001490 state->BinOp_type = make_type(state, "BinOp", state->expr_type,
1491 BinOp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001492 "BinOp(expr left, operator op, expr right)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001493 if (!state->BinOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001494 state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001495 UnaryOp_fields, 2,
1496 "UnaryOp(unaryop op, expr operand)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001497 if (!state->UnaryOp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001498 state->Lambda_type = make_type(state, "Lambda", state->expr_type,
1499 Lambda_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001500 "Lambda(arguments args, expr body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001501 if (!state->Lambda_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001502 state->IfExp_type = make_type(state, "IfExp", state->expr_type,
1503 IfExp_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001504 "IfExp(expr test, expr body, expr orelse)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001505 if (!state->IfExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001506 state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields,
1507 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001508 "Dict(expr* keys, expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001509 if (!state->Dict_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001510 state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001511 "Set(expr* elts)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001512 if (!state->Set_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001513 state->ListComp_type = make_type(state, "ListComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001514 ListComp_fields, 2,
1515 "ListComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001516 if (!state->ListComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001517 state->SetComp_type = make_type(state, "SetComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001518 SetComp_fields, 2,
1519 "SetComp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001520 if (!state->SetComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001521 state->DictComp_type = make_type(state, "DictComp", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001522 DictComp_fields, 3,
1523 "DictComp(expr key, expr value, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001524 if (!state->DictComp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001525 state->GeneratorExp_type = make_type(state, "GeneratorExp",
1526 state->expr_type, GeneratorExp_fields,
1527 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001528 "GeneratorExp(expr elt, comprehension* generators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001529 if (!state->GeneratorExp_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001530 state->Await_type = make_type(state, "Await", state->expr_type,
1531 Await_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001532 "Await(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001533 if (!state->Await_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001534 state->Yield_type = make_type(state, "Yield", state->expr_type,
1535 Yield_fields, 1,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001536 "Yield(expr? value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001537 if (!state->Yield_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001538 if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1)
1539 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001540 state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001541 YieldFrom_fields, 1,
1542 "YieldFrom(expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001543 if (!state->YieldFrom_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001544 state->Compare_type = make_type(state, "Compare", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001545 Compare_fields, 3,
1546 "Compare(expr left, cmpop* ops, expr* comparators)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001547 if (!state->Compare_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001548 state->Call_type = make_type(state, "Call", state->expr_type, Call_fields,
1549 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001550 "Call(expr func, expr* args, keyword* keywords)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001551 if (!state->Call_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001552 state->FormattedValue_type = make_type(state, "FormattedValue",
1553 state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001554 FormattedValue_fields, 3,
1555 "FormattedValue(expr value, int? conversion, expr? format_spec)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001556 if (!state->FormattedValue_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001557 if (PyObject_SetAttr(state->FormattedValue_type, state->conversion,
1558 Py_None) == -1)
1559 return 0;
1560 if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec,
1561 Py_None) == -1)
1562 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001563 state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001564 JoinedStr_fields, 1,
1565 "JoinedStr(expr* values)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001566 if (!state->JoinedStr_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001567 state->Constant_type = make_type(state, "Constant", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001568 Constant_fields, 2,
1569 "Constant(constant value, string? kind)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001570 if (!state->Constant_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001571 if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1)
1572 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001573 state->Attribute_type = make_type(state, "Attribute", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001574 Attribute_fields, 3,
1575 "Attribute(expr value, identifier attr, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001576 if (!state->Attribute_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001577 state->Subscript_type = make_type(state, "Subscript", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001578 Subscript_fields, 3,
1579 "Subscript(expr value, expr slice, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001580 if (!state->Subscript_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001581 state->Starred_type = make_type(state, "Starred", state->expr_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001582 Starred_fields, 2,
1583 "Starred(expr value, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001584 if (!state->Starred_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001585 state->Name_type = make_type(state, "Name", state->expr_type, Name_fields,
1586 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001587 "Name(identifier id, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001588 if (!state->Name_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001589 state->List_type = make_type(state, "List", state->expr_type, List_fields,
1590 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001591 "List(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001592 if (!state->List_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001593 state->Tuple_type = make_type(state, "Tuple", state->expr_type,
1594 Tuple_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001595 "Tuple(expr* elts, expr_context ctx)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001596 if (!state->Tuple_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001597 state->Slice_type = make_type(state, "Slice", state->expr_type,
1598 Slice_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001599 "Slice(expr? lower, expr? upper, expr? step)");
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001600 if (!state->Slice_type) return 0;
1601 if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1)
1602 return 0;
1603 if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1)
1604 return 0;
1605 if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1)
1606 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001607 state->expr_context_type = make_type(state, "expr_context",
1608 state->AST_type, NULL, 0,
Serhiy Storchaka6b975982020-03-17 23:41:08 +02001609 "expr_context = Load | Store | Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001610 if (!state->expr_context_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001611 if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0;
1612 state->Load_type = make_type(state, "Load", state->expr_context_type, NULL,
1613 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001614 "Load");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001615 if (!state->Load_type) return 0;
1616 state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type,
1617 NULL, NULL);
1618 if (!state->Load_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001619 state->Store_type = make_type(state, "Store", state->expr_context_type,
1620 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001621 "Store");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001622 if (!state->Store_type) return 0;
1623 state->Store_singleton = PyType_GenericNew((PyTypeObject
1624 *)state->Store_type, NULL, NULL);
1625 if (!state->Store_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001626 state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001627 "Del");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001628 if (!state->Del_type) return 0;
1629 state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type,
1630 NULL, NULL);
1631 if (!state->Del_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001632 state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001633 "boolop = And | Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001634 if (!state->boolop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001635 if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0;
1636 state->And_type = make_type(state, "And", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001637 "And");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001638 if (!state->And_type) return 0;
1639 state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type,
1640 NULL, NULL);
1641 if (!state->And_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001642 state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001643 "Or");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001644 if (!state->Or_type) return 0;
1645 state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type,
1646 NULL, NULL);
1647 if (!state->Or_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001648 state->operator_type = make_type(state, "operator", state->AST_type, NULL,
1649 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001650 "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001651 if (!state->operator_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001652 if (!add_attributes(state, state->operator_type, NULL, 0)) return 0;
1653 state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001654 "Add");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001655 if (!state->Add_type) return 0;
1656 state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type,
1657 NULL, NULL);
1658 if (!state->Add_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001659 state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001660 "Sub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001661 if (!state->Sub_type) return 0;
1662 state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type,
1663 NULL, NULL);
1664 if (!state->Sub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001665 state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001666 "Mult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001667 if (!state->Mult_type) return 0;
1668 state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type,
1669 NULL, NULL);
1670 if (!state->Mult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001671 state->MatMult_type = make_type(state, "MatMult", state->operator_type,
1672 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001673 "MatMult");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001674 if (!state->MatMult_type) return 0;
1675 state->MatMult_singleton = PyType_GenericNew((PyTypeObject
1676 *)state->MatMult_type, NULL,
1677 NULL);
1678 if (!state->MatMult_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001679 state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001680 "Div");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001681 if (!state->Div_type) return 0;
1682 state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type,
1683 NULL, NULL);
1684 if (!state->Div_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001685 state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001686 "Mod");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001687 if (!state->Mod_type) return 0;
1688 state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type,
1689 NULL, NULL);
1690 if (!state->Mod_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001691 state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001692 "Pow");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001693 if (!state->Pow_type) return 0;
1694 state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type,
1695 NULL, NULL);
1696 if (!state->Pow_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001697 state->LShift_type = make_type(state, "LShift", state->operator_type, NULL,
1698 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001699 "LShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001700 if (!state->LShift_type) return 0;
1701 state->LShift_singleton = PyType_GenericNew((PyTypeObject
1702 *)state->LShift_type, NULL,
1703 NULL);
1704 if (!state->LShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001705 state->RShift_type = make_type(state, "RShift", state->operator_type, NULL,
1706 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001707 "RShift");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001708 if (!state->RShift_type) return 0;
1709 state->RShift_singleton = PyType_GenericNew((PyTypeObject
1710 *)state->RShift_type, NULL,
1711 NULL);
1712 if (!state->RShift_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001713 state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001714 "BitOr");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001715 if (!state->BitOr_type) return 0;
1716 state->BitOr_singleton = PyType_GenericNew((PyTypeObject
1717 *)state->BitOr_type, NULL, NULL);
1718 if (!state->BitOr_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001719 state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL,
1720 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001721 "BitXor");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001722 if (!state->BitXor_type) return 0;
1723 state->BitXor_singleton = PyType_GenericNew((PyTypeObject
1724 *)state->BitXor_type, NULL,
1725 NULL);
1726 if (!state->BitXor_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001727 state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL,
1728 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001729 "BitAnd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001730 if (!state->BitAnd_type) return 0;
1731 state->BitAnd_singleton = PyType_GenericNew((PyTypeObject
1732 *)state->BitAnd_type, NULL,
1733 NULL);
1734 if (!state->BitAnd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001735 state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type,
1736 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001737 "FloorDiv");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001738 if (!state->FloorDiv_type) return 0;
1739 state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject
1740 *)state->FloorDiv_type, NULL,
1741 NULL);
1742 if (!state->FloorDiv_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001743 state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001744 "unaryop = Invert | Not | UAdd | USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001745 if (!state->unaryop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001746 if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0;
1747 state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL,
1748 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001749 "Invert");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001750 if (!state->Invert_type) return 0;
1751 state->Invert_singleton = PyType_GenericNew((PyTypeObject
1752 *)state->Invert_type, NULL,
1753 NULL);
1754 if (!state->Invert_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001755 state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001756 "Not");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001757 if (!state->Not_type) return 0;
1758 state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type,
1759 NULL, NULL);
1760 if (!state->Not_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001761 state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001762 "UAdd");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001763 if (!state->UAdd_type) return 0;
1764 state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type,
1765 NULL, NULL);
1766 if (!state->UAdd_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001767 state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001768 "USub");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001769 if (!state->USub_type) return 0;
1770 state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type,
1771 NULL, NULL);
1772 if (!state->USub_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001773 state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001774 "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001775 if (!state->cmpop_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001776 if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0;
1777 state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001778 "Eq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001779 if (!state->Eq_type) return 0;
1780 state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type,
1781 NULL, NULL);
1782 if (!state->Eq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001783 state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001784 "NotEq");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001785 if (!state->NotEq_type) return 0;
1786 state->NotEq_singleton = PyType_GenericNew((PyTypeObject
1787 *)state->NotEq_type, NULL, NULL);
1788 if (!state->NotEq_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001789 state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001790 "Lt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001791 if (!state->Lt_type) return 0;
1792 state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type,
1793 NULL, NULL);
1794 if (!state->Lt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001795 state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001796 "LtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001797 if (!state->LtE_type) return 0;
1798 state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type,
1799 NULL, NULL);
1800 if (!state->LtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001801 state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001802 "Gt");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001803 if (!state->Gt_type) return 0;
1804 state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type,
1805 NULL, NULL);
1806 if (!state->Gt_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001807 state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001808 "GtE");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001809 if (!state->GtE_type) return 0;
1810 state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type,
1811 NULL, NULL);
1812 if (!state->GtE_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001813 state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001814 "Is");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001815 if (!state->Is_type) return 0;
1816 state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type,
1817 NULL, NULL);
1818 if (!state->Is_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001819 state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001820 "IsNot");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001821 if (!state->IsNot_type) return 0;
1822 state->IsNot_singleton = PyType_GenericNew((PyTypeObject
1823 *)state->IsNot_type, NULL, NULL);
1824 if (!state->IsNot_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001825 state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001826 "In");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001827 if (!state->In_type) return 0;
1828 state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type,
1829 NULL, NULL);
1830 if (!state->In_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001831 state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001832 "NotIn");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001833 if (!state->NotIn_type) return 0;
1834 state->NotIn_singleton = PyType_GenericNew((PyTypeObject
1835 *)state->NotIn_type, NULL, NULL);
1836 if (!state->NotIn_singleton) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001837 state->comprehension_type = make_type(state, "comprehension",
1838 state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001839 comprehension_fields, 4,
1840 "comprehension(expr target, expr iter, expr* ifs, int is_async)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001841 if (!state->comprehension_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001842 if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0;
1843 state->excepthandler_type = make_type(state, "excepthandler",
1844 state->AST_type, NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001845 "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001846 if (!state->excepthandler_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001847 if (!add_attributes(state, state->excepthandler_type,
1848 excepthandler_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001849 if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None)
1850 == -1)
1851 return 0;
1852 if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset,
1853 Py_None) == -1)
1854 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001855 state->ExceptHandler_type = make_type(state, "ExceptHandler",
Dino Viehlandac46eb42019-09-11 10:16:34 -07001856 state->excepthandler_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001857 ExceptHandler_fields, 3,
1858 "ExceptHandler(expr? type, identifier? name, stmt* body)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001859 if (!state->ExceptHandler_type) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001860 if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1)
1861 return 0;
1862 if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1)
1863 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001864 state->arguments_type = make_type(state, "arguments", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001865 arguments_fields, 7,
1866 "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001867 if (!state->arguments_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001868 if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001869 if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1)
1870 return 0;
1871 if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1)
1872 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001873 state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001874 "arg(identifier arg, expr? annotation, string? type_comment)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001875 if (!state->arg_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001876 if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001877 if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1)
1878 return 0;
1879 if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1)
1880 return 0;
1881 if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1)
1882 return 0;
1883 if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1)
1884 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001885 state->keyword_type = make_type(state, "keyword", state->AST_type,
1886 keyword_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001887 "keyword(identifier? arg, expr value)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001888 if (!state->keyword_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001889 if (!add_attributes(state, state->keyword_type, keyword_attributes, 4))
1890 return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001891 if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1)
1892 return 0;
Pablo Galindo168660b2020-04-02 00:47:39 +01001893 if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1)
1894 return 0;
1895 if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None)
1896 == -1)
1897 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001898 state->alias_type = make_type(state, "alias", state->AST_type,
1899 alias_fields, 2,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001900 "alias(identifier name, identifier? asname)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001901 if (!state->alias_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001902 if (!add_attributes(state, state->alias_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001903 if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1)
1904 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001905 state->withitem_type = make_type(state, "withitem", state->AST_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001906 withitem_fields, 2,
1907 "withitem(expr context_expr, expr? optional_vars)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001908 if (!state->withitem_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001909 if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0;
Serhiy Storchakab7e95252020-03-10 00:07:47 +02001910 if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None)
1911 == -1)
1912 return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001913 state->type_ignore_type = make_type(state, "type_ignore", state->AST_type,
1914 NULL, 0,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001915 "type_ignore = TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001916 if (!state->type_ignore_type) return 0;
Victor Stinner74419f02020-07-03 11:35:37 +02001917 if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0;
1918 state->TypeIgnore_type = make_type(state, "TypeIgnore",
1919 state->type_ignore_type,
Batuhan Taşkaya4ab362c2020-03-16 11:12:53 +03001920 TypeIgnore_fields, 2,
1921 "TypeIgnore(int lineno, string tag)");
Dino Viehlandac46eb42019-09-11 10:16:34 -07001922 if (!state->TypeIgnore_type) return 0;
Victor Stinnerfd957c12020-11-03 18:07:15 +01001923
Dino Viehlandac46eb42019-09-11 10:16:34 -07001924 state->initialized = 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001925 return 1;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001926}
Neal Norwitz7b5a6042005-11-13 19:14:20 +00001927
Victor Stinner5cf47822020-11-02 22:03:28 +01001928static int obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001929 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001930static int obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001931 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001932static int obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001933 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001934static int obj2ast_expr_context(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001935 expr_context_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001936static int obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty*
1937 out, PyArena* arena);
1938static int obj2ast_operator(struct ast_state *state, PyObject* obj,
1939 operator_ty* out, PyArena* arena);
1940static int obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02001941 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001942static int obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001943 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001944static int obj2ast_comprehension(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001945 comprehension_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001946static int obj2ast_excepthandler(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001947 excepthandler_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001948static int obj2ast_arguments(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001949 arguments_ty* out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001950static int obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001951 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001952static int obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02001953 out, PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001954static int obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02001955 PyArena* arena);
Victor Stinner5cf47822020-11-02 22:03:28 +01001956static int obj2ast_withitem(struct ast_state *state, PyObject* obj,
1957 withitem_ty* out, PyArena* arena);
1958static int obj2ast_type_ignore(struct ast_state *state, PyObject* obj,
Victor Stinner74419f02020-07-03 11:35:37 +02001959 type_ignore_ty* out, PyArena* arena);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00001960
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01001962Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, PyArena
1963 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001965 mod_ty p;
1966 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1967 if (!p)
1968 return NULL;
1969 p->kind = Module_kind;
1970 p->v.Module.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001971 p->v.Module.type_ignores = type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001972 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973}
1974
1975mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01001976Interactive(asdl_stmt_seq * body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001977{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001978 mod_ty p;
1979 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1980 if (!p)
1981 return NULL;
1982 p->kind = Interactive_kind;
1983 p->v.Interactive.body = body;
1984 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985}
1986
1987mod_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001988Expression(expr_ty body, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001990 mod_ty p;
1991 if (!body) {
1992 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03001993 "field 'body' is required for Expression");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02001994 return NULL;
1995 }
1996 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
1997 if (!p)
1998 return NULL;
1999 p->kind = Expression_kind;
2000 p->v.Expression.body = body;
2001 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002002}
2003
2004mod_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002005FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002006{
2007 mod_ty p;
2008 if (!returns) {
2009 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002010 "field 'returns' is required for FunctionType");
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002011 return NULL;
2012 }
2013 p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
2014 if (!p)
2015 return NULL;
2016 p->kind = FunctionType_kind;
2017 p->v.FunctionType.argtypes = argtypes;
2018 p->v.FunctionType.returns = returns;
2019 return p;
2020}
2021
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002023FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
2024 asdl_expr_seq * decorator_list, expr_ty returns, string
2025 type_comment, int lineno, int col_offset, int end_lineno, int
2026 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002028 stmt_ty p;
2029 if (!name) {
2030 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002031 "field 'name' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002032 return NULL;
2033 }
2034 if (!args) {
2035 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002036 "field 'args' is required for FunctionDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002037 return NULL;
2038 }
2039 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2040 if (!p)
2041 return NULL;
2042 p->kind = FunctionDef_kind;
2043 p->v.FunctionDef.name = name;
2044 p->v.FunctionDef.args = args;
2045 p->v.FunctionDef.body = body;
2046 p->v.FunctionDef.decorator_list = decorator_list;
2047 p->v.FunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002048 p->v.FunctionDef.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002049 p->lineno = lineno;
2050 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002051 p->end_lineno = end_lineno;
2052 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002053 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054}
2055
2056stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002057AsyncFunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * body,
2058 asdl_expr_seq * decorator_list, expr_ty returns, string
2059 type_comment, int lineno, int col_offset, int end_lineno, int
2060 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002061{
2062 stmt_ty p;
2063 if (!name) {
2064 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002065 "field 'name' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002066 return NULL;
2067 }
2068 if (!args) {
2069 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002070 "field 'args' is required for AsyncFunctionDef");
Yury Selivanov75445082015-05-11 22:57:16 -04002071 return NULL;
2072 }
2073 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2074 if (!p)
2075 return NULL;
2076 p->kind = AsyncFunctionDef_kind;
2077 p->v.AsyncFunctionDef.name = name;
2078 p->v.AsyncFunctionDef.args = args;
2079 p->v.AsyncFunctionDef.body = body;
2080 p->v.AsyncFunctionDef.decorator_list = decorator_list;
2081 p->v.AsyncFunctionDef.returns = returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002082 p->v.AsyncFunctionDef.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002083 p->lineno = lineno;
2084 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002085 p->end_lineno = end_lineno;
2086 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002087 return p;
2088}
2089
2090stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002091ClassDef(identifier name, asdl_expr_seq * bases, asdl_keyword_seq * keywords,
2092 asdl_stmt_seq * body, asdl_expr_seq * decorator_list, int lineno, int
2093 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002095 stmt_ty p;
2096 if (!name) {
2097 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002098 "field 'name' is required for ClassDef");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002099 return NULL;
2100 }
2101 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2102 if (!p)
2103 return NULL;
2104 p->kind = ClassDef_kind;
2105 p->v.ClassDef.name = name;
2106 p->v.ClassDef.bases = bases;
2107 p->v.ClassDef.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002108 p->v.ClassDef.body = body;
2109 p->v.ClassDef.decorator_list = decorator_list;
2110 p->lineno = lineno;
2111 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002112 p->end_lineno = end_lineno;
2113 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002114 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115}
2116
2117stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002118Return(expr_ty value, int lineno, int col_offset, int end_lineno, int
2119 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002121 stmt_ty p;
2122 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2123 if (!p)
2124 return NULL;
2125 p->kind = Return_kind;
2126 p->v.Return.value = value;
2127 p->lineno = lineno;
2128 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002129 p->end_lineno = end_lineno;
2130 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002131 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132}
2133
2134stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002135Delete(asdl_expr_seq * targets, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002136 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002138 stmt_ty p;
2139 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2140 if (!p)
2141 return NULL;
2142 p->kind = Delete_kind;
2143 p->v.Delete.targets = targets;
2144 p->lineno = lineno;
2145 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002146 p->end_lineno = end_lineno;
2147 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002148 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002149}
2150
2151stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002152Assign(asdl_expr_seq * targets, expr_ty value, string type_comment, int lineno,
2153 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002155 stmt_ty p;
2156 if (!value) {
2157 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002158 "field 'value' is required for Assign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002159 return NULL;
2160 }
2161 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2162 if (!p)
2163 return NULL;
2164 p->kind = Assign_kind;
2165 p->v.Assign.targets = targets;
2166 p->v.Assign.value = value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002167 p->v.Assign.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002168 p->lineno = lineno;
2169 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002170 p->end_lineno = end_lineno;
2171 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002172 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002173}
2174
2175stmt_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002176AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002177 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002179 stmt_ty p;
2180 if (!target) {
2181 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002182 "field 'target' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002183 return NULL;
2184 }
2185 if (!op) {
2186 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002187 "field 'op' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002188 return NULL;
2189 }
2190 if (!value) {
2191 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002192 "field 'value' is required for AugAssign");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002193 return NULL;
2194 }
2195 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2196 if (!p)
2197 return NULL;
2198 p->kind = AugAssign_kind;
2199 p->v.AugAssign.target = target;
2200 p->v.AugAssign.op = op;
2201 p->v.AugAssign.value = value;
2202 p->lineno = lineno;
2203 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002204 p->end_lineno = end_lineno;
2205 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002206 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002207}
2208
2209stmt_ty
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002210AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002211 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2212 *arena)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002213{
2214 stmt_ty p;
2215 if (!target) {
2216 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002217 "field 'target' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002218 return NULL;
2219 }
2220 if (!annotation) {
2221 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002222 "field 'annotation' is required for AnnAssign");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002223 return NULL;
2224 }
2225 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2226 if (!p)
2227 return NULL;
2228 p->kind = AnnAssign_kind;
2229 p->v.AnnAssign.target = target;
2230 p->v.AnnAssign.annotation = annotation;
2231 p->v.AnnAssign.value = value;
2232 p->v.AnnAssign.simple = simple;
2233 p->lineno = lineno;
2234 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002235 p->end_lineno = end_lineno;
2236 p->end_col_offset = end_col_offset;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002237 return p;
2238}
2239
2240stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002241For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq * orelse,
2242 string type_comment, int lineno, int col_offset, int end_lineno, int
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002243 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002244{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002245 stmt_ty p;
2246 if (!target) {
2247 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002248 "field 'target' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002249 return NULL;
2250 }
2251 if (!iter) {
2252 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002253 "field 'iter' is required for For");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002254 return NULL;
2255 }
2256 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2257 if (!p)
2258 return NULL;
2259 p->kind = For_kind;
2260 p->v.For.target = target;
2261 p->v.For.iter = iter;
2262 p->v.For.body = body;
2263 p->v.For.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002264 p->v.For.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002265 p->lineno = lineno;
2266 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002267 p->end_lineno = end_lineno;
2268 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002269 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270}
2271
2272stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002273AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, asdl_stmt_seq *
2274 orelse, string type_comment, int lineno, int col_offset, int
2275 end_lineno, int end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002276{
2277 stmt_ty p;
2278 if (!target) {
2279 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002280 "field 'target' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002281 return NULL;
2282 }
2283 if (!iter) {
2284 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002285 "field 'iter' is required for AsyncFor");
Yury Selivanov75445082015-05-11 22:57:16 -04002286 return NULL;
2287 }
2288 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2289 if (!p)
2290 return NULL;
2291 p->kind = AsyncFor_kind;
2292 p->v.AsyncFor.target = target;
2293 p->v.AsyncFor.iter = iter;
2294 p->v.AsyncFor.body = body;
2295 p->v.AsyncFor.orelse = orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002296 p->v.AsyncFor.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002297 p->lineno = lineno;
2298 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002299 p->end_lineno = end_lineno;
2300 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002301 return p;
2302}
2303
2304stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002305While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno,
2306 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002308 stmt_ty p;
2309 if (!test) {
2310 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002311 "field 'test' is required for While");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002312 return NULL;
2313 }
2314 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2315 if (!p)
2316 return NULL;
2317 p->kind = While_kind;
2318 p->v.While.test = test;
2319 p->v.While.body = body;
2320 p->v.While.orelse = orelse;
2321 p->lineno = lineno;
2322 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002323 p->end_lineno = end_lineno;
2324 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002325 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326}
2327
2328stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002329If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002330 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002332 stmt_ty p;
2333 if (!test) {
2334 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002335 "field 'test' is required for If");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002336 return NULL;
2337 }
2338 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2339 if (!p)
2340 return NULL;
2341 p->kind = If_kind;
2342 p->v.If.test = test;
2343 p->v.If.body = body;
2344 p->v.If.orelse = orelse;
2345 p->lineno = lineno;
2346 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002347 p->end_lineno = end_lineno;
2348 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002349 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002350}
2351
2352stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002353With(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment, int
2354 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002355{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002356 stmt_ty p;
2357 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2358 if (!p)
2359 return NULL;
2360 p->kind = With_kind;
2361 p->v.With.items = items;
2362 p->v.With.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002363 p->v.With.type_comment = type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002364 p->lineno = lineno;
2365 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002366 p->end_lineno = end_lineno;
2367 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002368 return p;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002369}
2370
2371stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002372AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, string type_comment,
2373 int lineno, int col_offset, int end_lineno, int end_col_offset,
2374 PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002375{
2376 stmt_ty p;
2377 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2378 if (!p)
2379 return NULL;
2380 p->kind = AsyncWith_kind;
2381 p->v.AsyncWith.items = items;
2382 p->v.AsyncWith.body = body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002383 p->v.AsyncWith.type_comment = type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04002384 p->lineno = lineno;
2385 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002386 p->end_lineno = end_lineno;
2387 p->end_col_offset = end_col_offset;
Yury Selivanov75445082015-05-11 22:57:16 -04002388 return p;
2389}
2390
2391stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002392Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno,
2393 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002395 stmt_ty p;
2396 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2397 if (!p)
2398 return NULL;
2399 p->kind = Raise_kind;
2400 p->v.Raise.exc = exc;
2401 p->v.Raise.cause = cause;
2402 p->lineno = lineno;
2403 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002404 p->end_lineno = end_lineno;
2405 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002406 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002407}
2408
2409stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002410Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, asdl_stmt_seq *
2411 orelse, asdl_stmt_seq * finalbody, int lineno, int col_offset, int
2412 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002414 stmt_ty p;
2415 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2416 if (!p)
2417 return NULL;
2418 p->kind = Try_kind;
2419 p->v.Try.body = body;
2420 p->v.Try.handlers = handlers;
2421 p->v.Try.orelse = orelse;
2422 p->v.Try.finalbody = finalbody;
2423 p->lineno = lineno;
2424 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002425 p->end_lineno = end_lineno;
2426 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002427 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428}
2429
2430stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002431Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno,
2432 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002433{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002434 stmt_ty p;
2435 if (!test) {
2436 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002437 "field 'test' is required for Assert");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002438 return NULL;
2439 }
2440 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2441 if (!p)
2442 return NULL;
2443 p->kind = Assert_kind;
2444 p->v.Assert.test = test;
2445 p->v.Assert.msg = msg;
2446 p->lineno = lineno;
2447 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002448 p->end_lineno = end_lineno;
2449 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002450 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451}
2452
2453stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002454Import(asdl_alias_seq * names, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002455 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002457 stmt_ty p;
2458 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2459 if (!p)
2460 return NULL;
2461 p->kind = Import_kind;
2462 p->v.Import.names = names;
2463 p->lineno = lineno;
2464 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002465 p->end_lineno = end_lineno;
2466 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002467 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468}
2469
2470stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002471ImportFrom(identifier module, asdl_alias_seq * names, int level, int lineno,
2472 int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002473{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002474 stmt_ty p;
2475 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2476 if (!p)
2477 return NULL;
2478 p->kind = ImportFrom_kind;
2479 p->v.ImportFrom.module = module;
2480 p->v.ImportFrom.names = names;
2481 p->v.ImportFrom.level = level;
2482 p->lineno = lineno;
2483 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002484 p->end_lineno = end_lineno;
2485 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002486 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002487}
2488
2489stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002490Global(asdl_identifier_seq * names, int lineno, int col_offset, int end_lineno,
2491 int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002492{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002493 stmt_ty p;
2494 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2495 if (!p)
2496 return NULL;
2497 p->kind = Global_kind;
2498 p->v.Global.names = names;
2499 p->lineno = lineno;
2500 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002501 p->end_lineno = end_lineno;
2502 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002503 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504}
2505
2506stmt_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002507Nonlocal(asdl_identifier_seq * names, int lineno, int col_offset, int
2508 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton81e95022007-02-27 06:50:52 +00002509{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002510 stmt_ty p;
2511 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2512 if (!p)
2513 return NULL;
2514 p->kind = Nonlocal_kind;
2515 p->v.Nonlocal.names = names;
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 Hylton81e95022007-02-27 06:50:52 +00002521}
2522
2523stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002524Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int
2525 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002526{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002527 stmt_ty p;
2528 if (!value) {
2529 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002530 "field 'value' is required for Expr");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002531 return NULL;
2532 }
2533 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2534 if (!p)
2535 return NULL;
2536 p->kind = Expr_kind;
2537 p->v.Expr.value = value;
2538 p->lineno = lineno;
2539 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002540 p->end_lineno = end_lineno;
2541 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002542 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002543}
2544
2545stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002546Pass(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2547 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002549 stmt_ty p;
2550 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2551 if (!p)
2552 return NULL;
2553 p->kind = Pass_kind;
2554 p->lineno = lineno;
2555 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002556 p->end_lineno = end_lineno;
2557 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002558 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559}
2560
2561stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002562Break(int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2563 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002565 stmt_ty p;
2566 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2567 if (!p)
2568 return NULL;
2569 p->kind = Break_kind;
2570 p->lineno = lineno;
2571 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002572 p->end_lineno = end_lineno;
2573 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002574 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575}
2576
2577stmt_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002578Continue(int lineno, int col_offset, int end_lineno, int end_col_offset,
2579 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002580{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002581 stmt_ty p;
2582 p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
2583 if (!p)
2584 return NULL;
2585 p->kind = Continue_kind;
2586 p->lineno = lineno;
2587 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002588 p->end_lineno = end_lineno;
2589 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002590 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591}
2592
2593expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002594BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int col_offset, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002595 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002597 expr_ty p;
2598 if (!op) {
2599 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002600 "field 'op' is required for BoolOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002601 return NULL;
2602 }
2603 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2604 if (!p)
2605 return NULL;
2606 p->kind = BoolOp_kind;
2607 p->v.BoolOp.op = op;
2608 p->v.BoolOp.values = values;
2609 p->lineno = lineno;
2610 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002611 p->end_lineno = end_lineno;
2612 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002613 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614}
2615
2616expr_ty
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002617NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int
2618 end_lineno, int end_col_offset, PyArena *arena)
2619{
2620 expr_ty p;
2621 if (!target) {
2622 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002623 "field 'target' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002624 return NULL;
2625 }
2626 if (!value) {
2627 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002628 "field 'value' is required for NamedExpr");
Emily Morehouse8f59ee02019-01-24 16:49:56 -07002629 return NULL;
2630 }
2631 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2632 if (!p)
2633 return NULL;
2634 p->kind = NamedExpr_kind;
2635 p->v.NamedExpr.target = target;
2636 p->v.NamedExpr.value = value;
2637 p->lineno = lineno;
2638 p->col_offset = col_offset;
2639 p->end_lineno = end_lineno;
2640 p->end_col_offset = end_col_offset;
2641 return p;
2642}
2643
2644expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002645BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002646 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002648 expr_ty p;
2649 if (!left) {
2650 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002651 "field 'left' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002652 return NULL;
2653 }
2654 if (!op) {
2655 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002656 "field 'op' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002657 return NULL;
2658 }
2659 if (!right) {
2660 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002661 "field 'right' is required for BinOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002662 return NULL;
2663 }
2664 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2665 if (!p)
2666 return NULL;
2667 p->kind = BinOp_kind;
2668 p->v.BinOp.left = left;
2669 p->v.BinOp.op = op;
2670 p->v.BinOp.right = right;
2671 p->lineno = lineno;
2672 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002673 p->end_lineno = end_lineno;
2674 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002675 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676}
2677
2678expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002679UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int
2680 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002682 expr_ty p;
2683 if (!op) {
2684 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002685 "field 'op' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002686 return NULL;
2687 }
2688 if (!operand) {
2689 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002690 "field 'operand' is required for UnaryOp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002691 return NULL;
2692 }
2693 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2694 if (!p)
2695 return NULL;
2696 p->kind = UnaryOp_kind;
2697 p->v.UnaryOp.op = op;
2698 p->v.UnaryOp.operand = operand;
2699 p->lineno = lineno;
2700 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002701 p->end_lineno = end_lineno;
2702 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002703 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704}
2705
2706expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002707Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int
2708 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002710 expr_ty p;
2711 if (!args) {
2712 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002713 "field 'args' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002714 return NULL;
2715 }
2716 if (!body) {
2717 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002718 "field 'body' is required for Lambda");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002719 return NULL;
2720 }
2721 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2722 if (!p)
2723 return NULL;
2724 p->kind = Lambda_kind;
2725 p->v.Lambda.args = args;
2726 p->v.Lambda.body = body;
2727 p->lineno = lineno;
2728 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002729 p->end_lineno = end_lineno;
2730 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002731 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732}
2733
2734expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002735IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002736 int end_lineno, int end_col_offset, PyArena *arena)
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002737{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002738 expr_ty p;
2739 if (!test) {
2740 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002741 "field 'test' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002742 return NULL;
2743 }
2744 if (!body) {
2745 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002746 "field 'body' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002747 return NULL;
2748 }
2749 if (!orelse) {
2750 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002751 "field 'orelse' is required for IfExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002752 return NULL;
2753 }
2754 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2755 if (!p)
2756 return NULL;
2757 p->kind = IfExp_kind;
2758 p->v.IfExp.test = test;
2759 p->v.IfExp.body = body;
2760 p->v.IfExp.orelse = orelse;
2761 p->lineno = lineno;
2762 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002763 p->end_lineno = end_lineno;
2764 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002765 return p;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002766}
2767
2768expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002769Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, int col_offset,
2770 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002772 expr_ty p;
2773 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2774 if (!p)
2775 return NULL;
2776 p->kind = Dict_kind;
2777 p->v.Dict.keys = keys;
2778 p->v.Dict.values = values;
2779 p->lineno = lineno;
2780 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002781 p->end_lineno = end_lineno;
2782 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002783 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002784}
2785
2786expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002787Set(asdl_expr_seq * elts, int lineno, int col_offset, int end_lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002788 end_col_offset, PyArena *arena)
Guido van Rossum86e58e22006-08-28 15:27:34 +00002789{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002790 expr_ty p;
2791 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2792 if (!p)
2793 return NULL;
2794 p->kind = Set_kind;
2795 p->v.Set.elts = elts;
2796 p->lineno = lineno;
2797 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002798 p->end_lineno = end_lineno;
2799 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002800 return p;
Guido van Rossum86e58e22006-08-28 15:27:34 +00002801}
2802
2803expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002804ListComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2805 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002806{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002807 expr_ty p;
2808 if (!elt) {
2809 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002810 "field 'elt' is required for ListComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002811 return NULL;
2812 }
2813 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2814 if (!p)
2815 return NULL;
2816 p->kind = ListComp_kind;
2817 p->v.ListComp.elt = elt;
2818 p->v.ListComp.generators = generators;
2819 p->lineno = lineno;
2820 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002821 p->end_lineno = end_lineno;
2822 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002823 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002824}
2825
2826expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002827SetComp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2828 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002829{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002830 expr_ty p;
2831 if (!elt) {
2832 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002833 "field 'elt' is required for SetComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002834 return NULL;
2835 }
2836 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2837 if (!p)
2838 return NULL;
2839 p->kind = SetComp_kind;
2840 p->v.SetComp.elt = elt;
2841 p->v.SetComp.generators = generators;
2842 p->lineno = lineno;
2843 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002844 p->end_lineno = end_lineno;
2845 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002846 return p;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002847}
2848
2849expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002850DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * generators, int
2851 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2852 *arena)
Guido van Rossum992d4a32007-07-11 13:09:30 +00002853{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002854 expr_ty p;
2855 if (!key) {
2856 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002857 "field 'key' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002858 return NULL;
2859 }
2860 if (!value) {
2861 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002862 "field 'value' is required for DictComp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002863 return NULL;
2864 }
2865 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2866 if (!p)
2867 return NULL;
2868 p->kind = DictComp_kind;
2869 p->v.DictComp.key = key;
2870 p->v.DictComp.value = value;
2871 p->v.DictComp.generators = generators;
2872 p->lineno = lineno;
2873 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002874 p->end_lineno = end_lineno;
2875 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002876 return p;
Guido van Rossum992d4a32007-07-11 13:09:30 +00002877}
2878
2879expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002880GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, int lineno, int
2881 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002883 expr_ty p;
2884 if (!elt) {
2885 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002886 "field 'elt' is required for GeneratorExp");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002887 return NULL;
2888 }
2889 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2890 if (!p)
2891 return NULL;
2892 p->kind = GeneratorExp_kind;
2893 p->v.GeneratorExp.elt = elt;
2894 p->v.GeneratorExp.generators = generators;
2895 p->lineno = lineno;
2896 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002897 p->end_lineno = end_lineno;
2898 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002899 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002900}
2901
2902expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002903Await(expr_ty value, int lineno, int col_offset, int end_lineno, int
2904 end_col_offset, PyArena *arena)
Yury Selivanov75445082015-05-11 22:57:16 -04002905{
2906 expr_ty p;
2907 if (!value) {
2908 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002909 "field 'value' is required for Await");
Yury Selivanov75445082015-05-11 22:57:16 -04002910 return NULL;
2911 }
2912 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2913 if (!p)
2914 return NULL;
2915 p->kind = Await_kind;
2916 p->v.Await.value = value;
2917 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;
Yury Selivanov75445082015-05-11 22:57:16 -04002921 return p;
2922}
2923
2924expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002925Yield(expr_ty value, int lineno, int col_offset, int end_lineno, int
2926 end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002928 expr_ty p;
2929 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2930 if (!p)
2931 return NULL;
2932 p->kind = Yield_kind;
2933 p->v.Yield.value = value;
2934 p->lineno = lineno;
2935 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002936 p->end_lineno = end_lineno;
2937 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002938 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939}
2940
2941expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002942YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int
2943 end_col_offset, PyArena *arena)
Benjamin Peterson527c6222012-01-14 08:58:23 -05002944{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002945 expr_ty p;
2946 if (!value) {
2947 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002948 "field 'value' is required for YieldFrom");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002949 return NULL;
2950 }
2951 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2952 if (!p)
2953 return NULL;
2954 p->kind = YieldFrom_kind;
2955 p->v.YieldFrom.value = value;
2956 p->lineno = lineno;
2957 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002958 p->end_lineno = end_lineno;
2959 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002960 return p;
Benjamin Peterson527c6222012-01-14 08:58:23 -05002961}
2962
2963expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002964Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * comparators, int
2965 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena
2966 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002968 expr_ty p;
2969 if (!left) {
2970 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002971 "field 'left' is required for Compare");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002972 return NULL;
2973 }
2974 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2975 if (!p)
2976 return NULL;
2977 p->kind = Compare_kind;
2978 p->v.Compare.left = left;
2979 p->v.Compare.ops = ops;
2980 p->v.Compare.comparators = comparators;
2981 p->lineno = lineno;
2982 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00002983 p->end_lineno = end_lineno;
2984 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002985 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002986}
2987
2988expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01002989Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * keywords, int
2990 lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002991{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002992 expr_ty p;
2993 if (!func) {
2994 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03002995 "field 'func' is required for Call");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02002996 return NULL;
2997 }
2998 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
2999 if (!p)
3000 return NULL;
3001 p->kind = Call_kind;
3002 p->v.Call.func = func;
3003 p->v.Call.args = args;
3004 p->v.Call.keywords = keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003005 p->lineno = lineno;
3006 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003007 p->end_lineno = end_lineno;
3008 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003009 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010}
3011
3012expr_ty
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04003013FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno,
3014 int col_offset, int end_lineno, int end_col_offset, PyArena
3015 *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003016{
3017 expr_ty p;
3018 if (!value) {
3019 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003020 "field 'value' is required for FormattedValue");
Eric V. Smith235a6f02015-09-19 14:51:32 -04003021 return NULL;
3022 }
3023 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3024 if (!p)
3025 return NULL;
3026 p->kind = FormattedValue_kind;
3027 p->v.FormattedValue.value = value;
3028 p->v.FormattedValue.conversion = conversion;
3029 p->v.FormattedValue.format_spec = format_spec;
3030 p->lineno = lineno;
3031 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003032 p->end_lineno = end_lineno;
3033 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003034 return p;
3035}
3036
3037expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003038JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, int end_lineno,
3039 int end_col_offset, PyArena *arena)
Eric V. Smith235a6f02015-09-19 14:51:32 -04003040{
3041 expr_ty p;
3042 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3043 if (!p)
3044 return NULL;
3045 p->kind = JoinedStr_kind;
3046 p->v.JoinedStr.values = values;
3047 p->lineno = lineno;
3048 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003049 p->end_lineno = end_lineno;
3050 p->end_col_offset = end_col_offset;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003051 return p;
3052}
3053
3054expr_ty
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003055Constant(constant value, string kind, int lineno, int col_offset, int
3056 end_lineno, int end_col_offset, PyArena *arena)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003057{
3058 expr_ty p;
3059 if (!value) {
3060 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003061 "field 'value' is required for Constant");
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003062 return NULL;
3063 }
3064 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3065 if (!p)
3066 return NULL;
3067 p->kind = Constant_kind;
3068 p->v.Constant.value = value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07003069 p->v.Constant.kind = kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003070 p->lineno = lineno;
3071 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003072 p->end_lineno = end_lineno;
3073 p->end_col_offset = end_col_offset;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003074 return p;
3075}
3076
3077expr_ty
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003078Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003079 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003081 expr_ty p;
3082 if (!value) {
3083 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003084 "field 'value' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003085 return NULL;
3086 }
3087 if (!attr) {
3088 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003089 "field 'attr' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003090 return NULL;
3091 }
3092 if (!ctx) {
3093 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003094 "field 'ctx' is required for Attribute");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003095 return NULL;
3096 }
3097 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3098 if (!p)
3099 return NULL;
3100 p->kind = Attribute_kind;
3101 p->v.Attribute.value = value;
3102 p->v.Attribute.attr = attr;
3103 p->v.Attribute.ctx = ctx;
3104 p->lineno = lineno;
3105 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003106 p->end_lineno = end_lineno;
3107 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003108 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109}
3110
3111expr_ty
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003112Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003113 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003115 expr_ty p;
3116 if (!value) {
3117 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003118 "field 'value' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003119 return NULL;
3120 }
3121 if (!slice) {
3122 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003123 "field 'slice' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003124 return NULL;
3125 }
3126 if (!ctx) {
3127 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003128 "field 'ctx' is required for Subscript");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003129 return NULL;
3130 }
3131 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3132 if (!p)
3133 return NULL;
3134 p->kind = Subscript_kind;
3135 p->v.Subscript.value = value;
3136 p->v.Subscript.slice = slice;
3137 p->v.Subscript.ctx = ctx;
3138 p->lineno = lineno;
3139 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003140 p->end_lineno = end_lineno;
3141 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003142 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003143}
3144
3145expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003146Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int
3147 end_lineno, int end_col_offset, PyArena *arena)
Guido van Rossum0368b722007-05-11 16:50:42 +00003148{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003149 expr_ty p;
3150 if (!value) {
3151 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003152 "field 'value' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003153 return NULL;
3154 }
3155 if (!ctx) {
3156 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003157 "field 'ctx' is required for Starred");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003158 return NULL;
3159 }
3160 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3161 if (!p)
3162 return NULL;
3163 p->kind = Starred_kind;
3164 p->v.Starred.value = value;
3165 p->v.Starred.ctx = ctx;
3166 p->lineno = lineno;
3167 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003168 p->end_lineno = end_lineno;
3169 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003170 return p;
Guido van Rossum0368b722007-05-11 16:50:42 +00003171}
3172
3173expr_ty
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003174Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int
3175 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003177 expr_ty p;
3178 if (!id) {
3179 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003180 "field 'id' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003181 return NULL;
3182 }
3183 if (!ctx) {
3184 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003185 "field 'ctx' is required for Name");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003186 return NULL;
3187 }
3188 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3189 if (!p)
3190 return NULL;
3191 p->kind = Name_kind;
3192 p->v.Name.id = id;
3193 p->v.Name.ctx = ctx;
3194 p->lineno = lineno;
3195 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003196 p->end_lineno = end_lineno;
3197 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003198 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199}
3200
3201expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003202List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003203 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003205 expr_ty p;
3206 if (!ctx) {
3207 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003208 "field 'ctx' is required for List");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003209 return NULL;
3210 }
3211 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3212 if (!p)
3213 return NULL;
3214 p->kind = List_kind;
3215 p->v.List.elts = elts;
3216 p->v.List.ctx = ctx;
3217 p->lineno = lineno;
3218 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003219 p->end_lineno = end_lineno;
3220 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003221 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222}
3223
3224expr_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003225Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int col_offset,
3226 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003228 expr_ty p;
3229 if (!ctx) {
3230 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003231 "field 'ctx' is required for Tuple");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003232 return NULL;
3233 }
3234 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
3235 if (!p)
3236 return NULL;
3237 p->kind = Tuple_kind;
3238 p->v.Tuple.elts = elts;
3239 p->v.Tuple.ctx = ctx;
3240 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;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245}
3246
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003247expr_ty
3248Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset,
3249 int end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003251 expr_ty p;
3252 p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003253 if (!p)
3254 return NULL;
3255 p->kind = Slice_kind;
3256 p->v.Slice.lower = lower;
3257 p->v.Slice.upper = upper;
3258 p->v.Slice.step = step;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003259 p->lineno = lineno;
3260 p->col_offset = col_offset;
3261 p->end_lineno = end_lineno;
3262 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003263 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003264}
3265
3266comprehension_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003267comprehension(expr_ty target, expr_ty iter, asdl_expr_seq * ifs, int is_async,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003268 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003270 comprehension_ty p;
3271 if (!target) {
3272 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003273 "field 'target' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003274 return NULL;
3275 }
3276 if (!iter) {
3277 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003278 "field 'iter' is required for comprehension");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003279 return NULL;
3280 }
3281 p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
3282 if (!p)
3283 return NULL;
3284 p->target = target;
3285 p->iter = iter;
3286 p->ifs = ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003287 p->is_async = is_async;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003288 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289}
3290
3291excepthandler_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003292ExceptHandler(expr_ty type, identifier name, asdl_stmt_seq * body, int lineno,
3293 int col_offset, int end_lineno, int end_col_offset, PyArena
3294 *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003295{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003296 excepthandler_ty p;
3297 p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
3298 if (!p)
3299 return NULL;
3300 p->kind = ExceptHandler_kind;
3301 p->v.ExceptHandler.type = type;
3302 p->v.ExceptHandler.name = name;
3303 p->v.ExceptHandler.body = body;
3304 p->lineno = lineno;
3305 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003306 p->end_lineno = end_lineno;
3307 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003308 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309}
3310
3311arguments_ty
Pablo Galindoa5634c42020-09-16 19:42:00 +01003312arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, arg_ty vararg,
3313 asdl_arg_seq * kwonlyargs, asdl_expr_seq * kw_defaults, arg_ty kwarg,
3314 asdl_expr_seq * defaults, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003315{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003316 arguments_ty p;
3317 p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
3318 if (!p)
3319 return NULL;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01003320 p->posonlyargs = posonlyargs;
Pablo Galindocd6e83b2019-07-15 01:32:18 +02003321 p->args = args;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003322 p->vararg = vararg;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003323 p->kwonlyargs = kwonlyargs;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003324 p->kw_defaults = kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02003325 p->kwarg = kwarg;
3326 p->defaults = defaults;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003327 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328}
3329
Neal Norwitzc1505362006-12-28 06:47:50 +00003330arg_ty
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003331arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int
3332 col_offset, int end_lineno, int end_col_offset, PyArena *arena)
Neal Norwitzc1505362006-12-28 06:47:50 +00003333{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003334 arg_ty p;
3335 if (!arg) {
3336 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003337 "field 'arg' is required for arg");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003338 return NULL;
3339 }
3340 p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
3341 if (!p)
3342 return NULL;
3343 p->arg = arg;
3344 p->annotation = annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003345 p->type_comment = type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01003346 p->lineno = lineno;
3347 p->col_offset = col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003348 p->end_lineno = end_lineno;
3349 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003350 return p;
Neal Norwitzc1505362006-12-28 06:47:50 +00003351}
3352
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353keyword_ty
Pablo Galindo168660b2020-04-02 00:47:39 +01003354keyword(identifier arg, expr_ty value, int lineno, int col_offset, int
3355 end_lineno, int end_col_offset, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003357 keyword_ty p;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003358 if (!value) {
3359 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003360 "field 'value' is required for keyword");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003361 return NULL;
3362 }
3363 p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
3364 if (!p)
3365 return NULL;
3366 p->arg = arg;
3367 p->value = value;
Pablo Galindo168660b2020-04-02 00:47:39 +01003368 p->lineno = lineno;
3369 p->col_offset = col_offset;
3370 p->end_lineno = end_lineno;
3371 p->end_col_offset = end_col_offset;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003372 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003373}
3374
3375alias_ty
Neal Norwitzadb69fc2005-12-17 20:54:49 +00003376alias(identifier name, identifier asname, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003378 alias_ty p;
3379 if (!name) {
3380 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003381 "field 'name' is required for alias");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003382 return NULL;
3383 }
3384 p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
3385 if (!p)
3386 return NULL;
3387 p->name = name;
3388 p->asname = asname;
3389 return p;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390}
3391
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003392withitem_ty
3393withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
3394{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003395 withitem_ty p;
3396 if (!context_expr) {
3397 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003398 "field 'context_expr' is required for withitem");
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003399 return NULL;
3400 }
3401 p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
3402 if (!p)
3403 return NULL;
3404 p->context_expr = context_expr;
3405 p->optional_vars = optional_vars;
3406 return p;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003407}
3408
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003409type_ignore_ty
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003410TypeIgnore(int lineno, string tag, PyArena *arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003411{
3412 type_ignore_ty p;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003413 if (!tag) {
3414 PyErr_SetString(PyExc_ValueError,
Batuhan Taskaya091951a2020-05-06 17:29:32 +03003415 "field 'tag' is required for TypeIgnore");
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003416 return NULL;
3417 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003418 p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p));
3419 if (!p)
3420 return NULL;
3421 p->kind = TypeIgnore_kind;
3422 p->v.TypeIgnore.lineno = lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07003423 p->v.TypeIgnore.tag = tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003424 return p;
3425}
3426
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003427
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003428PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003429ast2obj_mod(struct ast_state *state, void* _o)
Neal Norwitz7b5a6042005-11-13 19:14:20 +00003430{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003431 mod_ty o = (mod_ty)_o;
3432 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003433 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003434 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003435 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003436 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003437 switch (o->kind) {
3438 case Module_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003439 tp = (PyTypeObject *)state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003440 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003441 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003442 value = ast2obj_list(state, (asdl_seq*)o->v.Module.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003443 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003444 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003445 goto failed;
3446 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003447 value = ast2obj_list(state, (asdl_seq*)o->v.Module.type_ignores,
Victor Stinner74419f02020-07-03 11:35:37 +02003448 ast2obj_type_ignore);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003449 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003450 if (PyObject_SetAttr(result, state->type_ignores, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003451 goto failed;
3452 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003453 break;
3454 case Interactive_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003455 tp = (PyTypeObject *)state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003456 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003457 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003458 value = ast2obj_list(state, (asdl_seq*)o->v.Interactive.body,
3459 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003460 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003461 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003462 goto failed;
3463 Py_DECREF(value);
3464 break;
3465 case Expression_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003466 tp = (PyTypeObject *)state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003467 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003468 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003469 value = ast2obj_expr(state, o->v.Expression.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003470 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003471 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003472 goto failed;
3473 Py_DECREF(value);
3474 break;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003475 case FunctionType_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003476 tp = (PyTypeObject *)state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003477 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003478 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003479 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionType.argtypes,
3480 ast2obj_expr);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003481 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003482 if (PyObject_SetAttr(result, state->argtypes, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003483 goto failed;
3484 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003485 value = ast2obj_expr(state, o->v.FunctionType.returns);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003486 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003487 if (PyObject_SetAttr(result, state->returns, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003488 goto failed;
3489 Py_DECREF(value);
3490 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003491 }
3492 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003493failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003494 Py_XDECREF(value);
3495 Py_XDECREF(result);
3496 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003497}
3498
Martin v. Löwisbd260da2006-02-26 19:42:26 +00003499PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01003500ast2obj_stmt(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003501{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003502 stmt_ty o = (stmt_ty)_o;
3503 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003504 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003505 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003506 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003507 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003508 switch (o->kind) {
3509 case FunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003510 tp = (PyTypeObject *)state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003511 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003512 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003513 value = ast2obj_identifier(state, o->v.FunctionDef.name);
Martin v. Löwis577b5b92006-02-27 15:23:19 +00003514 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003515 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003516 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003517 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003518 value = ast2obj_arguments(state, o->v.FunctionDef.args);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003519 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003520 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003521 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00003522 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003523 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.body,
3524 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003525 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003526 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003527 goto failed;
3528 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003529 value = ast2obj_list(state, (asdl_seq*)o->v.FunctionDef.decorator_list,
Victor Stinner74419f02020-07-03 11:35:37 +02003530 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003531 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003532 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003533 goto failed;
3534 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003535 value = ast2obj_expr(state, o->v.FunctionDef.returns);
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->returns, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003538 goto failed;
3539 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003540 value = ast2obj_string(state, o->v.FunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003541 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003542 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003543 goto failed;
3544 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003545 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003546 case AsyncFunctionDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003547 tp = (PyTypeObject *)state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003548 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003549 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003550 value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name);
Yury Selivanov75445082015-05-11 22:57:16 -04003551 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003552 if (PyObject_SetAttr(result, state->name, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003553 goto failed;
3554 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003555 value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args);
Yury Selivanov75445082015-05-11 22:57:16 -04003556 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003557 if (PyObject_SetAttr(result, state->args, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003558 goto failed;
3559 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003560 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFunctionDef.body,
3561 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003562 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003563 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003564 goto failed;
3565 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003566 value = ast2obj_list(state,
3567 (asdl_seq*)o->v.AsyncFunctionDef.decorator_list,
Yury Selivanov75445082015-05-11 22:57:16 -04003568 ast2obj_expr);
3569 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003570 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003571 goto failed;
3572 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003573 value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns);
Yury Selivanov75445082015-05-11 22:57:16 -04003574 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003575 if (PyObject_SetAttr(result, state->returns, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003576 goto failed;
3577 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003578 value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003579 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003580 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003581 goto failed;
3582 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003583 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003584 case ClassDef_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003585 tp = (PyTypeObject *)state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003586 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003587 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003588 value = ast2obj_identifier(state, o->v.ClassDef.name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003589 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003590 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003591 goto failed;
3592 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003593 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.bases,
3594 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003595 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003596 if (PyObject_SetAttr(result, state->bases, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003597 goto failed;
3598 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003599 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.keywords,
3600 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003601 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003602 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003603 goto failed;
3604 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003605 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.body,
3606 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003607 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003608 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003609 goto failed;
3610 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003611 value = ast2obj_list(state, (asdl_seq*)o->v.ClassDef.decorator_list,
3612 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003613 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003614 if (PyObject_SetAttr(result, state->decorator_list, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003615 goto failed;
3616 Py_DECREF(value);
3617 break;
3618 case Return_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003619 tp = (PyTypeObject *)state->Return_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.Return.value);
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->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003625 goto failed;
3626 Py_DECREF(value);
3627 break;
3628 case Delete_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003629 tp = (PyTypeObject *)state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003630 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003631 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003632 value = ast2obj_list(state, (asdl_seq*)o->v.Delete.targets,
3633 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003634 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003635 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003636 goto failed;
3637 Py_DECREF(value);
3638 break;
3639 case Assign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003640 tp = (PyTypeObject *)state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003641 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003642 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003643 value = ast2obj_list(state, (asdl_seq*)o->v.Assign.targets,
3644 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003645 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003646 if (PyObject_SetAttr(result, state->targets, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003647 goto failed;
3648 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003649 value = ast2obj_expr(state, o->v.Assign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003650 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003651 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003652 goto failed;
3653 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003654 value = ast2obj_string(state, o->v.Assign.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003655 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003656 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003657 goto failed;
3658 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003659 break;
3660 case AugAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003661 tp = (PyTypeObject *)state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003662 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003663 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003664 value = ast2obj_expr(state, o->v.AugAssign.target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003665 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003666 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003667 goto failed;
3668 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003669 value = ast2obj_operator(state, o->v.AugAssign.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003670 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003671 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003672 goto failed;
3673 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003674 value = ast2obj_expr(state, o->v.AugAssign.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003675 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003676 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003677 goto failed;
3678 Py_DECREF(value);
3679 break;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003680 case AnnAssign_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003681 tp = (PyTypeObject *)state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003682 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003683 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003684 value = ast2obj_expr(state, o->v.AnnAssign.target);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003685 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003686 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003687 goto failed;
3688 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003689 value = ast2obj_expr(state, o->v.AnnAssign.annotation);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003690 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003691 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003692 goto failed;
3693 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003694 value = ast2obj_expr(state, o->v.AnnAssign.value);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003695 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003696 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003697 goto failed;
3698 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003699 value = ast2obj_int(state, o->v.AnnAssign.simple);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003700 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003701 if (PyObject_SetAttr(result, state->simple, value) == -1)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003702 goto failed;
3703 Py_DECREF(value);
3704 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003705 case For_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003706 tp = (PyTypeObject *)state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003707 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003708 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003709 value = ast2obj_expr(state, o->v.For.target);
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->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003712 goto failed;
3713 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003714 value = ast2obj_expr(state, o->v.For.iter);
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->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003717 goto failed;
3718 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003719 value = ast2obj_list(state, (asdl_seq*)o->v.For.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003720 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003721 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003722 goto failed;
3723 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003724 value = ast2obj_list(state, (asdl_seq*)o->v.For.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003725 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003726 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003727 goto failed;
3728 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003729 value = ast2obj_string(state, o->v.For.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003730 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003731 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003732 goto failed;
3733 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003734 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003735 case AsyncFor_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003736 tp = (PyTypeObject *)state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003737 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003738 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003739 value = ast2obj_expr(state, o->v.AsyncFor.target);
Yury Selivanov75445082015-05-11 22:57:16 -04003740 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003741 if (PyObject_SetAttr(result, state->target, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003742 goto failed;
3743 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003744 value = ast2obj_expr(state, o->v.AsyncFor.iter);
Yury Selivanov75445082015-05-11 22:57:16 -04003745 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003746 if (PyObject_SetAttr(result, state->iter, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003747 goto failed;
3748 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003749 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.body,
3750 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003751 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003752 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003753 goto failed;
3754 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003755 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncFor.orelse,
3756 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003757 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003758 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003759 goto failed;
3760 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003761 value = ast2obj_string(state, o->v.AsyncFor.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003762 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003763 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003764 goto failed;
3765 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003766 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003767 case While_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003768 tp = (PyTypeObject *)state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003769 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003770 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003771 value = ast2obj_expr(state, o->v.While.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003772 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003773 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003774 goto failed;
3775 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003776 value = ast2obj_list(state, (asdl_seq*)o->v.While.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003777 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003778 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003779 goto failed;
3780 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003781 value = ast2obj_list(state, (asdl_seq*)o->v.While.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003782 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003783 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003784 goto failed;
3785 Py_DECREF(value);
3786 break;
3787 case If_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003788 tp = (PyTypeObject *)state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003789 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003790 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003791 value = ast2obj_expr(state, o->v.If.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003792 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003793 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003794 goto failed;
3795 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003796 value = ast2obj_list(state, (asdl_seq*)o->v.If.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003797 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003798 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003799 goto failed;
3800 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003801 value = ast2obj_list(state, (asdl_seq*)o->v.If.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003802 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003803 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003804 goto failed;
3805 Py_DECREF(value);
3806 break;
3807 case With_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003808 tp = (PyTypeObject *)state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003809 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003810 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003811 value = ast2obj_list(state, (asdl_seq*)o->v.With.items,
3812 ast2obj_withitem);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003813 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003814 if (PyObject_SetAttr(result, state->items, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003815 goto failed;
3816 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003817 value = ast2obj_list(state, (asdl_seq*)o->v.With.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003818 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003819 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003820 goto failed;
3821 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003822 value = ast2obj_string(state, o->v.With.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003823 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003824 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003825 goto failed;
3826 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003827 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003828 case AsyncWith_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003829 tp = (PyTypeObject *)state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003830 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04003831 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003832 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.items,
3833 ast2obj_withitem);
Yury Selivanov75445082015-05-11 22:57:16 -04003834 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003835 if (PyObject_SetAttr(result, state->items, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003836 goto failed;
3837 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003838 value = ast2obj_list(state, (asdl_seq*)o->v.AsyncWith.body,
3839 ast2obj_stmt);
Yury Selivanov75445082015-05-11 22:57:16 -04003840 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003841 if (PyObject_SetAttr(result, state->body, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04003842 goto failed;
3843 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003844 value = ast2obj_string(state, o->v.AsyncWith.type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003845 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003846 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08003847 goto failed;
3848 Py_DECREF(value);
Yury Selivanov75445082015-05-11 22:57:16 -04003849 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003850 case Raise_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003851 tp = (PyTypeObject *)state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003852 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003853 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003854 value = ast2obj_expr(state, o->v.Raise.exc);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003855 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003856 if (PyObject_SetAttr(result, state->exc, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003857 goto failed;
3858 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003859 value = ast2obj_expr(state, o->v.Raise.cause);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003860 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003861 if (PyObject_SetAttr(result, state->cause, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003862 goto failed;
3863 Py_DECREF(value);
3864 break;
3865 case Try_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003866 tp = (PyTypeObject *)state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003867 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003868 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003869 value = ast2obj_list(state, (asdl_seq*)o->v.Try.body, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003870 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003871 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003872 goto failed;
3873 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003874 value = ast2obj_list(state, (asdl_seq*)o->v.Try.handlers,
3875 ast2obj_excepthandler);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003876 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003877 if (PyObject_SetAttr(result, state->handlers, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003878 goto failed;
3879 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003880 value = ast2obj_list(state, (asdl_seq*)o->v.Try.orelse, ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003881 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003882 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003883 goto failed;
3884 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003885 value = ast2obj_list(state, (asdl_seq*)o->v.Try.finalbody,
3886 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003887 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003888 if (PyObject_SetAttr(result, state->finalbody, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003889 goto failed;
3890 Py_DECREF(value);
3891 break;
3892 case Assert_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003893 tp = (PyTypeObject *)state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003894 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003895 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003896 value = ast2obj_expr(state, o->v.Assert.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003897 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003898 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003899 goto failed;
3900 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003901 value = ast2obj_expr(state, o->v.Assert.msg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003902 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003903 if (PyObject_SetAttr(result, state->msg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003904 goto failed;
3905 Py_DECREF(value);
3906 break;
3907 case Import_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003908 tp = (PyTypeObject *)state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003909 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003910 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003911 value = ast2obj_list(state, (asdl_seq*)o->v.Import.names,
3912 ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003913 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003914 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003915 goto failed;
3916 Py_DECREF(value);
3917 break;
3918 case ImportFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003919 tp = (PyTypeObject *)state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003920 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003921 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003922 value = ast2obj_identifier(state, o->v.ImportFrom.module);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003923 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003924 if (PyObject_SetAttr(result, state->module, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003925 goto failed;
3926 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01003927 value = ast2obj_list(state, (asdl_seq*)o->v.ImportFrom.names,
3928 ast2obj_alias);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003929 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003930 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003931 goto failed;
3932 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003933 value = ast2obj_int(state, o->v.ImportFrom.level);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003934 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003935 if (PyObject_SetAttr(result, state->level, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003936 goto failed;
3937 Py_DECREF(value);
3938 break;
3939 case Global_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003940 tp = (PyTypeObject *)state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003941 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003942 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003943 value = ast2obj_list(state, (asdl_seq*)o->v.Global.names,
3944 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003945 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003946 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003947 goto failed;
3948 Py_DECREF(value);
3949 break;
3950 case Nonlocal_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003951 tp = (PyTypeObject *)state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003952 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003953 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003954 value = ast2obj_list(state, (asdl_seq*)o->v.Nonlocal.names,
3955 ast2obj_identifier);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003956 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003957 if (PyObject_SetAttr(result, state->names, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003958 goto failed;
3959 Py_DECREF(value);
3960 break;
3961 case Expr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003962 tp = (PyTypeObject *)state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003963 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003964 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003965 value = ast2obj_expr(state, o->v.Expr.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003966 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003967 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003968 goto failed;
3969 Py_DECREF(value);
3970 break;
3971 case Pass_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003972 tp = (PyTypeObject *)state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003973 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003974 if (!result) goto failed;
3975 break;
3976 case Break_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003977 tp = (PyTypeObject *)state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003978 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003979 if (!result) goto failed;
3980 break;
3981 case Continue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02003982 tp = (PyTypeObject *)state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07003983 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003984 if (!result) goto failed;
3985 break;
3986 }
Victor Stinner74419f02020-07-03 11:35:37 +02003987 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003988 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003989 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003990 goto failed;
3991 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003992 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003993 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003994 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02003995 goto failed;
3996 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02003997 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00003998 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02003999 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004000 goto failed;
4001 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004002 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004003 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004004 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004005 goto failed;
4006 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004007 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004008failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004009 Py_XDECREF(value);
4010 Py_XDECREF(result);
4011 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012}
4013
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004014PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004015ast2obj_expr(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004016{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004017 expr_ty o = (expr_ty)_o;
4018 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004019 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004020 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004021 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004022 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004023 switch (o->kind) {
4024 case BoolOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004025 tp = (PyTypeObject *)state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004026 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004027 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004028 value = ast2obj_boolop(state, o->v.BoolOp.op);
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->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004031 goto failed;
4032 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004033 value = ast2obj_list(state, (asdl_seq*)o->v.BoolOp.values,
4034 ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004035 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004036 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004037 goto failed;
4038 Py_DECREF(value);
4039 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004040 case NamedExpr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004041 tp = (PyTypeObject *)state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004042 result = PyType_GenericNew(tp, NULL, NULL);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004043 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004044 value = ast2obj_expr(state, o->v.NamedExpr.target);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004045 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004046 if (PyObject_SetAttr(result, state->target, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004047 goto failed;
4048 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004049 value = ast2obj_expr(state, o->v.NamedExpr.value);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004050 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004051 if (PyObject_SetAttr(result, state->value, value) == -1)
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004052 goto failed;
4053 Py_DECREF(value);
4054 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004055 case BinOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004056 tp = (PyTypeObject *)state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004057 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004058 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004059 value = ast2obj_expr(state, o->v.BinOp.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004060 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004061 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004062 goto failed;
4063 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004064 value = ast2obj_operator(state, o->v.BinOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004065 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004066 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004067 goto failed;
4068 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004069 value = ast2obj_expr(state, o->v.BinOp.right);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004070 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004071 if (PyObject_SetAttr(result, state->right, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004072 goto failed;
4073 Py_DECREF(value);
4074 break;
4075 case UnaryOp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004076 tp = (PyTypeObject *)state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004077 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004078 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004079 value = ast2obj_unaryop(state, o->v.UnaryOp.op);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004080 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004081 if (PyObject_SetAttr(result, state->op, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004082 goto failed;
4083 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004084 value = ast2obj_expr(state, o->v.UnaryOp.operand);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004085 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004086 if (PyObject_SetAttr(result, state->operand, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004087 goto failed;
4088 Py_DECREF(value);
4089 break;
4090 case Lambda_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004091 tp = (PyTypeObject *)state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004092 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004093 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004094 value = ast2obj_arguments(state, o->v.Lambda.args);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004095 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004096 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004097 goto failed;
4098 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004099 value = ast2obj_expr(state, o->v.Lambda.body);
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->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004102 goto failed;
4103 Py_DECREF(value);
4104 break;
4105 case IfExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004106 tp = (PyTypeObject *)state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004107 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004108 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004109 value = ast2obj_expr(state, o->v.IfExp.test);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004110 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004111 if (PyObject_SetAttr(result, state->test, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004112 goto failed;
4113 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004114 value = ast2obj_expr(state, o->v.IfExp.body);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004115 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004116 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004117 goto failed;
4118 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004119 value = ast2obj_expr(state, o->v.IfExp.orelse);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004120 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004121 if (PyObject_SetAttr(result, state->orelse, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004122 goto failed;
4123 Py_DECREF(value);
4124 break;
4125 case Dict_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004126 tp = (PyTypeObject *)state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004127 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004128 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004129 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.keys, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004130 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004131 if (PyObject_SetAttr(result, state->keys, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004132 goto failed;
4133 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004134 value = ast2obj_list(state, (asdl_seq*)o->v.Dict.values, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004135 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004136 if (PyObject_SetAttr(result, state->values, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004137 goto failed;
4138 Py_DECREF(value);
4139 break;
4140 case Set_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004141 tp = (PyTypeObject *)state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004142 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004143 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004144 value = ast2obj_list(state, (asdl_seq*)o->v.Set.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004145 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004146 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004147 goto failed;
4148 Py_DECREF(value);
4149 break;
4150 case ListComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004151 tp = (PyTypeObject *)state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004152 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004153 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004154 value = ast2obj_expr(state, o->v.ListComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004155 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004156 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004157 goto failed;
4158 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004159 value = ast2obj_list(state, (asdl_seq*)o->v.ListComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004160 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004161 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004162 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004163 goto failed;
4164 Py_DECREF(value);
4165 break;
4166 case SetComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004167 tp = (PyTypeObject *)state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004168 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004169 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004170 value = ast2obj_expr(state, o->v.SetComp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004171 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004172 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004173 goto failed;
4174 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004175 value = ast2obj_list(state, (asdl_seq*)o->v.SetComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004176 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004177 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004178 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004179 goto failed;
4180 Py_DECREF(value);
4181 break;
4182 case DictComp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004183 tp = (PyTypeObject *)state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004184 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004185 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004186 value = ast2obj_expr(state, o->v.DictComp.key);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004187 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004188 if (PyObject_SetAttr(result, state->key, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004189 goto failed;
4190 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004191 value = ast2obj_expr(state, o->v.DictComp.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004192 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004193 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004194 goto failed;
4195 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004196 value = ast2obj_list(state, (asdl_seq*)o->v.DictComp.generators,
Victor Stinner74419f02020-07-03 11:35:37 +02004197 ast2obj_comprehension);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004198 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004199 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004200 goto failed;
4201 Py_DECREF(value);
4202 break;
4203 case GeneratorExp_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004204 tp = (PyTypeObject *)state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004205 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004206 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004207 value = ast2obj_expr(state, o->v.GeneratorExp.elt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004208 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004209 if (PyObject_SetAttr(result, state->elt, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004210 goto failed;
4211 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004212 value = ast2obj_list(state, (asdl_seq*)o->v.GeneratorExp.generators,
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004213 ast2obj_comprehension);
4214 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004215 if (PyObject_SetAttr(result, state->generators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004216 goto failed;
4217 Py_DECREF(value);
4218 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004219 case Await_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004220 tp = (PyTypeObject *)state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004221 result = PyType_GenericNew(tp, NULL, NULL);
Yury Selivanov75445082015-05-11 22:57:16 -04004222 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004223 value = ast2obj_expr(state, o->v.Await.value);
Yury Selivanov75445082015-05-11 22:57:16 -04004224 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004225 if (PyObject_SetAttr(result, state->value, value) == -1)
Yury Selivanov75445082015-05-11 22:57:16 -04004226 goto failed;
4227 Py_DECREF(value);
4228 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004229 case Yield_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004230 tp = (PyTypeObject *)state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004231 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004232 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004233 value = ast2obj_expr(state, o->v.Yield.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004234 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004235 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004236 goto failed;
4237 Py_DECREF(value);
4238 break;
4239 case YieldFrom_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004240 tp = (PyTypeObject *)state->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004241 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004242 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004243 value = ast2obj_expr(state, o->v.YieldFrom.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004244 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004245 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004246 goto failed;
4247 Py_DECREF(value);
4248 break;
4249 case Compare_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004250 tp = (PyTypeObject *)state->Compare_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004251 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004252 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004253 value = ast2obj_expr(state, o->v.Compare.left);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004254 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004255 if (PyObject_SetAttr(result, state->left, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004256 goto failed;
4257 Py_DECREF(value);
4258 {
4259 Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
4260 value = PyList_New(n);
4261 if (!value) goto failed;
4262 for(i = 0; i < n; i++)
Victor Stinner74419f02020-07-03 11:35:37 +02004263 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 +00004264 }
Martin v. Löwis577b5b92006-02-27 15:23:19 +00004265 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004266 if (PyObject_SetAttr(result, state->ops, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004267 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004268 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004269 value = ast2obj_list(state, (asdl_seq*)o->v.Compare.comparators,
4270 ast2obj_expr);
Martin v. Löwis49c5da12006-03-01 22:49:05 +00004271 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004272 if (PyObject_SetAttr(result, state->comparators, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004273 goto failed;
Martin v. Löwis03e5bc02006-03-02 00:31:27 +00004274 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004275 break;
4276 case Call_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004277 tp = (PyTypeObject *)state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004278 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004279 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004280 value = ast2obj_expr(state, o->v.Call.func);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004281 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004282 if (PyObject_SetAttr(result, state->func, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004283 goto failed;
4284 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004285 value = ast2obj_list(state, (asdl_seq*)o->v.Call.args, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004286 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004287 if (PyObject_SetAttr(result, state->args, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004288 goto failed;
4289 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004290 value = ast2obj_list(state, (asdl_seq*)o->v.Call.keywords,
4291 ast2obj_keyword);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004292 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004293 if (PyObject_SetAttr(result, state->keywords, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004294 goto failed;
4295 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004296 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004297 case FormattedValue_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004298 tp = (PyTypeObject *)state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004299 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004300 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004301 value = ast2obj_expr(state, o->v.FormattedValue.value);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004302 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004303 if (PyObject_SetAttr(result, state->value, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004304 goto failed;
4305 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004306 value = ast2obj_int(state, o->v.FormattedValue.conversion);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004307 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004308 if (PyObject_SetAttr(result, state->conversion, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004309 goto failed;
4310 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004311 value = ast2obj_expr(state, o->v.FormattedValue.format_spec);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004312 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004313 if (PyObject_SetAttr(result, state->format_spec, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004314 goto failed;
4315 Py_DECREF(value);
4316 break;
4317 case JoinedStr_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004318 tp = (PyTypeObject *)state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004319 result = PyType_GenericNew(tp, NULL, NULL);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004320 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004321 value = ast2obj_list(state, (asdl_seq*)o->v.JoinedStr.values,
4322 ast2obj_expr);
Eric V. Smith235a6f02015-09-19 14:51:32 -04004323 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004324 if (PyObject_SetAttr(result, state->values, value) == -1)
Eric V. Smith235a6f02015-09-19 14:51:32 -04004325 goto failed;
4326 Py_DECREF(value);
4327 break;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004328 case Constant_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004329 tp = (PyTypeObject *)state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004330 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004331 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004332 value = ast2obj_constant(state, o->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004333 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004334 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004335 goto failed;
4336 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004337 value = ast2obj_string(state, o->v.Constant.kind);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004338 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004339 if (PyObject_SetAttr(result, state->kind, value) == -1)
Guido van Rossum10f8ce62019-03-13 13:00:46 -07004340 goto failed;
4341 Py_DECREF(value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004342 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004343 case Attribute_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004344 tp = (PyTypeObject *)state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004345 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004346 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004347 value = ast2obj_expr(state, o->v.Attribute.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004348 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004349 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004350 goto failed;
4351 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004352 value = ast2obj_identifier(state, o->v.Attribute.attr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004353 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004354 if (PyObject_SetAttr(result, state->attr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004355 goto failed;
4356 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004357 value = ast2obj_expr_context(state, o->v.Attribute.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004358 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004359 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004360 goto failed;
4361 Py_DECREF(value);
4362 break;
4363 case Subscript_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004364 tp = (PyTypeObject *)state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004365 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004366 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004367 value = ast2obj_expr(state, o->v.Subscript.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004368 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004369 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004370 goto failed;
4371 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004372 value = ast2obj_expr(state, o->v.Subscript.slice);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004373 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004374 if (PyObject_SetAttr(result, state->slice, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004375 goto failed;
4376 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004377 value = ast2obj_expr_context(state, o->v.Subscript.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004378 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004379 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004380 goto failed;
4381 Py_DECREF(value);
4382 break;
4383 case Starred_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004384 tp = (PyTypeObject *)state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004385 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004386 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004387 value = ast2obj_expr(state, o->v.Starred.value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004388 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004389 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004390 goto failed;
4391 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004392 value = ast2obj_expr_context(state, o->v.Starred.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004393 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004394 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004395 goto failed;
4396 Py_DECREF(value);
4397 break;
4398 case Name_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004399 tp = (PyTypeObject *)state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004400 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004401 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004402 value = ast2obj_identifier(state, o->v.Name.id);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004403 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004404 if (PyObject_SetAttr(result, state->id, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004405 goto failed;
4406 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004407 value = ast2obj_expr_context(state, o->v.Name.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004408 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004409 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004410 goto failed;
4411 Py_DECREF(value);
4412 break;
4413 case List_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004414 tp = (PyTypeObject *)state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004415 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004416 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004417 value = ast2obj_list(state, (asdl_seq*)o->v.List.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004418 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004419 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004420 goto failed;
4421 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004422 value = ast2obj_expr_context(state, o->v.List.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004423 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004424 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004425 goto failed;
4426 Py_DECREF(value);
4427 break;
4428 case Tuple_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004429 tp = (PyTypeObject *)state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004430 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004431 if (!result) goto failed;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004432 value = ast2obj_list(state, (asdl_seq*)o->v.Tuple.elts, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004433 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004434 if (PyObject_SetAttr(result, state->elts, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004435 goto failed;
4436 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004437 value = ast2obj_expr_context(state, o->v.Tuple.ctx);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004438 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004439 if (PyObject_SetAttr(result, state->ctx, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004440 goto failed;
4441 Py_DECREF(value);
4442 break;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004443 case Slice_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004444 tp = (PyTypeObject *)state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004445 result = PyType_GenericNew(tp, NULL, NULL);
4446 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004447 value = ast2obj_expr(state, o->v.Slice.lower);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004448 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004449 if (PyObject_SetAttr(result, state->lower, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004450 goto failed;
4451 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004452 value = ast2obj_expr(state, o->v.Slice.upper);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004453 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004454 if (PyObject_SetAttr(result, state->upper, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004455 goto failed;
4456 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004457 value = ast2obj_expr(state, o->v.Slice.step);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004458 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004459 if (PyObject_SetAttr(result, state->step, value) == -1)
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004460 goto failed;
4461 Py_DECREF(value);
4462 break;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004463 }
Victor Stinner74419f02020-07-03 11:35:37 +02004464 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004465 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004466 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004467 goto failed;
4468 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004469 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004470 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004471 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004472 goto failed;
4473 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004474 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004475 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004476 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004477 goto failed;
4478 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004479 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004480 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004481 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004482 goto failed;
4483 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004484 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004485failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004486 Py_XDECREF(value);
4487 Py_XDECREF(result);
4488 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004489}
4490
Victor Stinner5cf47822020-11-02 22:03:28 +01004491PyObject* ast2obj_expr_context(struct ast_state *state, expr_context_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004492{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004493 switch(o) {
4494 case Load:
Victor Stinner74419f02020-07-03 11:35:37 +02004495 Py_INCREF(state->Load_singleton);
4496 return state->Load_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004497 case Store:
Victor Stinner74419f02020-07-03 11:35:37 +02004498 Py_INCREF(state->Store_singleton);
4499 return state->Store_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004500 case Del:
Victor Stinner74419f02020-07-03 11:35:37 +02004501 Py_INCREF(state->Del_singleton);
4502 return state->Del_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004503 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004504 Py_UNREACHABLE();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004505}
Victor Stinner5cf47822020-11-02 22:03:28 +01004506PyObject* ast2obj_boolop(struct ast_state *state, boolop_ty o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004507{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004508 switch(o) {
4509 case And:
Victor Stinner74419f02020-07-03 11:35:37 +02004510 Py_INCREF(state->And_singleton);
4511 return state->And_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004512 case Or:
Victor Stinner74419f02020-07-03 11:35:37 +02004513 Py_INCREF(state->Or_singleton);
4514 return state->Or_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_operator(struct ast_state *state, operator_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004519{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004520 switch(o) {
4521 case Add:
Victor Stinner74419f02020-07-03 11:35:37 +02004522 Py_INCREF(state->Add_singleton);
4523 return state->Add_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004524 case Sub:
Victor Stinner74419f02020-07-03 11:35:37 +02004525 Py_INCREF(state->Sub_singleton);
4526 return state->Sub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004527 case Mult:
Victor Stinner74419f02020-07-03 11:35:37 +02004528 Py_INCREF(state->Mult_singleton);
4529 return state->Mult_singleton;
Benjamin Petersond51374e2014-04-09 23:55:56 -04004530 case MatMult:
Victor Stinner74419f02020-07-03 11:35:37 +02004531 Py_INCREF(state->MatMult_singleton);
4532 return state->MatMult_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004533 case Div:
Victor Stinner74419f02020-07-03 11:35:37 +02004534 Py_INCREF(state->Div_singleton);
4535 return state->Div_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004536 case Mod:
Victor Stinner74419f02020-07-03 11:35:37 +02004537 Py_INCREF(state->Mod_singleton);
4538 return state->Mod_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004539 case Pow:
Victor Stinner74419f02020-07-03 11:35:37 +02004540 Py_INCREF(state->Pow_singleton);
4541 return state->Pow_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004542 case LShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004543 Py_INCREF(state->LShift_singleton);
4544 return state->LShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004545 case RShift:
Victor Stinner74419f02020-07-03 11:35:37 +02004546 Py_INCREF(state->RShift_singleton);
4547 return state->RShift_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004548 case BitOr:
Victor Stinner74419f02020-07-03 11:35:37 +02004549 Py_INCREF(state->BitOr_singleton);
4550 return state->BitOr_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004551 case BitXor:
Victor Stinner74419f02020-07-03 11:35:37 +02004552 Py_INCREF(state->BitXor_singleton);
4553 return state->BitXor_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004554 case BitAnd:
Victor Stinner74419f02020-07-03 11:35:37 +02004555 Py_INCREF(state->BitAnd_singleton);
4556 return state->BitAnd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004557 case FloorDiv:
Victor Stinner74419f02020-07-03 11:35:37 +02004558 Py_INCREF(state->FloorDiv_singleton);
4559 return state->FloorDiv_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004560 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004561 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004562}
Victor Stinner5cf47822020-11-02 22:03:28 +01004563PyObject* ast2obj_unaryop(struct ast_state *state, unaryop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004564{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004565 switch(o) {
4566 case Invert:
Victor Stinner74419f02020-07-03 11:35:37 +02004567 Py_INCREF(state->Invert_singleton);
4568 return state->Invert_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004569 case Not:
Victor Stinner74419f02020-07-03 11:35:37 +02004570 Py_INCREF(state->Not_singleton);
4571 return state->Not_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004572 case UAdd:
Victor Stinner74419f02020-07-03 11:35:37 +02004573 Py_INCREF(state->UAdd_singleton);
4574 return state->UAdd_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004575 case USub:
Victor Stinner74419f02020-07-03 11:35:37 +02004576 Py_INCREF(state->USub_singleton);
4577 return state->USub_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004578 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004579 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004580}
Victor Stinner5cf47822020-11-02 22:03:28 +01004581PyObject* ast2obj_cmpop(struct ast_state *state, cmpop_ty o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004582{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004583 switch(o) {
4584 case Eq:
Victor Stinner74419f02020-07-03 11:35:37 +02004585 Py_INCREF(state->Eq_singleton);
4586 return state->Eq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004587 case NotEq:
Victor Stinner74419f02020-07-03 11:35:37 +02004588 Py_INCREF(state->NotEq_singleton);
4589 return state->NotEq_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004590 case Lt:
Victor Stinner74419f02020-07-03 11:35:37 +02004591 Py_INCREF(state->Lt_singleton);
4592 return state->Lt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004593 case LtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004594 Py_INCREF(state->LtE_singleton);
4595 return state->LtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004596 case Gt:
Victor Stinner74419f02020-07-03 11:35:37 +02004597 Py_INCREF(state->Gt_singleton);
4598 return state->Gt_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004599 case GtE:
Victor Stinner74419f02020-07-03 11:35:37 +02004600 Py_INCREF(state->GtE_singleton);
4601 return state->GtE_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004602 case Is:
Victor Stinner74419f02020-07-03 11:35:37 +02004603 Py_INCREF(state->Is_singleton);
4604 return state->Is_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004605 case IsNot:
Victor Stinner74419f02020-07-03 11:35:37 +02004606 Py_INCREF(state->IsNot_singleton);
4607 return state->IsNot_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004608 case In:
Victor Stinner74419f02020-07-03 11:35:37 +02004609 Py_INCREF(state->In_singleton);
4610 return state->In_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004611 case NotIn:
Victor Stinner74419f02020-07-03 11:35:37 +02004612 Py_INCREF(state->NotIn_singleton);
4613 return state->NotIn_singleton;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004614 }
Batuhan Taskaya091951a2020-05-06 17:29:32 +03004615 Py_UNREACHABLE();
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004616}
4617PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004618ast2obj_comprehension(struct ast_state *state, void* _o)
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004619{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004620 comprehension_ty o = (comprehension_ty)_o;
4621 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004622 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004623 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004624 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004625 }
Victor Stinner74419f02020-07-03 11:35:37 +02004626 tp = (PyTypeObject *)state->comprehension_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004627 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004628 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004629 value = ast2obj_expr(state, o->target);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004630 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004631 if (PyObject_SetAttr(result, state->target, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004632 goto failed;
4633 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004634 value = ast2obj_expr(state, o->iter);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004635 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004636 if (PyObject_SetAttr(result, state->iter, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004637 goto failed;
4638 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004639 value = ast2obj_list(state, (asdl_seq*)o->ifs, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004640 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004641 if (PyObject_SetAttr(result, state->ifs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004642 goto failed;
4643 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004644 value = ast2obj_int(state, o->is_async);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004645 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004646 if (PyObject_SetAttr(result, state->is_async, value) == -1)
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004647 goto failed;
4648 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004649 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004650failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004651 Py_XDECREF(value);
4652 Py_XDECREF(result);
4653 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004654}
4655
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004656PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004657ast2obj_excepthandler(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004658{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004659 excepthandler_ty o = (excepthandler_ty)_o;
4660 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004661 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004662 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004663 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004664 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004665 switch (o->kind) {
4666 case ExceptHandler_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004667 tp = (PyTypeObject *)state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004668 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004669 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004670 value = ast2obj_expr(state, o->v.ExceptHandler.type);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004671 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004672 if (PyObject_SetAttr(result, state->type, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004673 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004674 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004675 value = ast2obj_identifier(state, o->v.ExceptHandler.name);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004676 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004677 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004678 goto failed;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004679 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004680 value = ast2obj_list(state, (asdl_seq*)o->v.ExceptHandler.body,
4681 ast2obj_stmt);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004682 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004683 if (PyObject_SetAttr(result, state->body, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004684 goto failed;
4685 Py_DECREF(value);
4686 break;
4687 }
Victor Stinner74419f02020-07-03 11:35:37 +02004688 value = ast2obj_int(state, o->lineno);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004689 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004690 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004691 goto failed;
4692 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004693 value = ast2obj_int(state, o->col_offset);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004694 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004695 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004696 goto failed;
4697 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004698 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004699 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004700 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004701 goto failed;
4702 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004703 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004704 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004705 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004706 goto failed;
4707 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004708 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004709failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004710 Py_XDECREF(value);
4711 Py_XDECREF(result);
4712 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004713}
4714
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004715PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004716ast2obj_arguments(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004717{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004718 arguments_ty o = (arguments_ty)_o;
4719 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004720 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004721 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004722 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004723 }
Victor Stinner74419f02020-07-03 11:35:37 +02004724 tp = (PyTypeObject *)state->arguments_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004725 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004726 if (!result) return NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004727 value = ast2obj_list(state, (asdl_seq*)o->posonlyargs, ast2obj_arg);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004728 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004729 if (PyObject_SetAttr(result, state->posonlyargs, value) == -1)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01004730 goto failed;
4731 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004732 value = ast2obj_list(state, (asdl_seq*)o->args, ast2obj_arg);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004733 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004734 if (PyObject_SetAttr(result, state->args, value) == -1)
Pablo Galindocd6e83b2019-07-15 01:32:18 +02004735 goto failed;
4736 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004737 value = ast2obj_arg(state, o->vararg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004738 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004739 if (PyObject_SetAttr(result, state->vararg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004740 goto failed;
4741 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004742 value = ast2obj_list(state, (asdl_seq*)o->kwonlyargs, ast2obj_arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004743 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004744 if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004745 goto failed;
4746 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004747 value = ast2obj_list(state, (asdl_seq*)o->kw_defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004748 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004749 if (PyObject_SetAttr(result, state->kw_defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004750 goto failed;
4751 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004752 value = ast2obj_arg(state, o->kwarg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004753 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004754 if (PyObject_SetAttr(result, state->kwarg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004755 goto failed;
4756 Py_DECREF(value);
Pablo Galindoa5634c42020-09-16 19:42:00 +01004757 value = ast2obj_list(state, (asdl_seq*)o->defaults, ast2obj_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004758 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004759 if (PyObject_SetAttr(result, state->defaults, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004760 goto failed;
4761 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004762 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004763failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004764 Py_XDECREF(value);
4765 Py_XDECREF(result);
4766 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004767}
4768
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004769PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004770ast2obj_arg(struct ast_state *state, void* _o)
Neal Norwitzc1505362006-12-28 06:47:50 +00004771{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004772 arg_ty o = (arg_ty)_o;
4773 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004774 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004775 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004776 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004777 }
Victor Stinner74419f02020-07-03 11:35:37 +02004778 tp = (PyTypeObject *)state->arg_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004779 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004780 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004781 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004782 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004783 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004784 goto failed;
4785 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004786 value = ast2obj_expr(state, o->annotation);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004787 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004788 if (PyObject_SetAttr(result, state->annotation, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004789 goto failed;
4790 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004791 value = ast2obj_string(state, o->type_comment);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004792 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004793 if (PyObject_SetAttr(result, state->type_comment, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004794 goto failed;
4795 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004796 value = ast2obj_int(state, o->lineno);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004797 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004798 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004799 goto failed;
4800 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004801 value = ast2obj_int(state, o->col_offset);
Victor Stinneree4b59c2013-07-27 00:01:35 +02004802 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004803 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Victor Stinneree4b59c2013-07-27 00:01:35 +02004804 goto failed;
4805 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004806 value = ast2obj_int(state, o->end_lineno);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004807 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004808 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004809 goto failed;
4810 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004811 value = ast2obj_int(state, o->end_col_offset);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004812 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004813 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004814 goto failed;
4815 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004816 return result;
Neal Norwitzc1505362006-12-28 06:47:50 +00004817failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004818 Py_XDECREF(value);
4819 Py_XDECREF(result);
4820 return NULL;
Neal Norwitzc1505362006-12-28 06:47:50 +00004821}
4822
4823PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004824ast2obj_keyword(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004825{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004826 keyword_ty o = (keyword_ty)_o;
4827 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004828 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004829 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004830 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004831 }
Victor Stinner74419f02020-07-03 11:35:37 +02004832 tp = (PyTypeObject *)state->keyword_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004833 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004834 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004835 value = ast2obj_identifier(state, o->arg);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004836 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004837 if (PyObject_SetAttr(result, state->arg, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004838 goto failed;
4839 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004840 value = ast2obj_expr(state, o->value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004841 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004842 if (PyObject_SetAttr(result, state->value, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004843 goto failed;
4844 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004845 value = ast2obj_int(state, o->lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004846 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004847 if (PyObject_SetAttr(result, state->lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004848 goto failed;
4849 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004850 value = ast2obj_int(state, o->col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004851 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004852 if (PyObject_SetAttr(result, state->col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004853 goto failed;
4854 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004855 value = ast2obj_int(state, o->end_lineno);
Pablo Galindo168660b2020-04-02 00:47:39 +01004856 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004857 if (PyObject_SetAttr(result, state->end_lineno, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004858 goto failed;
4859 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004860 value = ast2obj_int(state, o->end_col_offset);
Pablo Galindo168660b2020-04-02 00:47:39 +01004861 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004862 if (PyObject_SetAttr(result, state->end_col_offset, value) < 0)
Pablo Galindo168660b2020-04-02 00:47:39 +01004863 goto failed;
4864 Py_DECREF(value);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004865 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004866failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004867 Py_XDECREF(value);
4868 Py_XDECREF(result);
4869 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004870}
4871
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004872PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004873ast2obj_alias(struct ast_state *state, void* _o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004874{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004875 alias_ty o = (alias_ty)_o;
4876 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004877 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004878 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004879 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004880 }
Victor Stinner74419f02020-07-03 11:35:37 +02004881 tp = (PyTypeObject *)state->alias_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004882 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004883 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004884 value = ast2obj_identifier(state, o->name);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004885 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004886 if (PyObject_SetAttr(result, state->name, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004887 goto failed;
4888 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004889 value = ast2obj_identifier(state, o->asname);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004890 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004891 if (PyObject_SetAttr(result, state->asname, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004892 goto failed;
4893 Py_DECREF(value);
4894 return result;
Martin v. Löwisbd260da2006-02-26 19:42:26 +00004895failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004896 Py_XDECREF(value);
4897 Py_XDECREF(result);
4898 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004899}
4900
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004901PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004902ast2obj_withitem(struct ast_state *state, void* _o)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004903{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004904 withitem_ty o = (withitem_ty)_o;
4905 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004906 PyTypeObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004907 if (!o) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004908 Py_RETURN_NONE;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004909 }
Victor Stinner74419f02020-07-03 11:35:37 +02004910 tp = (PyTypeObject *)state->withitem_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004911 result = PyType_GenericNew(tp, NULL, NULL);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004912 if (!result) return NULL;
Victor Stinner74419f02020-07-03 11:35:37 +02004913 value = ast2obj_expr(state, o->context_expr);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004914 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004915 if (PyObject_SetAttr(result, state->context_expr, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004916 goto failed;
4917 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004918 value = ast2obj_expr(state, o->optional_vars);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004919 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004920 if (PyObject_SetAttr(result, state->optional_vars, value) == -1)
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004921 goto failed;
4922 Py_DECREF(value);
4923 return result;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004924failed:
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004925 Py_XDECREF(value);
4926 Py_XDECREF(result);
4927 return NULL;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004928}
4929
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004930PyObject*
Victor Stinner5cf47822020-11-02 22:03:28 +01004931ast2obj_type_ignore(struct ast_state *state, void* _o)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004932{
4933 type_ignore_ty o = (type_ignore_ty)_o;
4934 PyObject *result = NULL, *value = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004935 PyTypeObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004936 if (!o) {
4937 Py_RETURN_NONE;
4938 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004939 switch (o->kind) {
4940 case TypeIgnore_kind:
Victor Stinner74419f02020-07-03 11:35:37 +02004941 tp = (PyTypeObject *)state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004942 result = PyType_GenericNew(tp, NULL, NULL);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004943 if (!result) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004944 value = ast2obj_int(state, o->v.TypeIgnore.lineno);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004945 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004946 if (PyObject_SetAttr(result, state->lineno, value) == -1)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004947 goto failed;
4948 Py_DECREF(value);
Victor Stinner74419f02020-07-03 11:35:37 +02004949 value = ast2obj_string(state, o->v.TypeIgnore.tag);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07004950 if (!value) goto failed;
Victor Stinner74419f02020-07-03 11:35:37 +02004951 if (PyObject_SetAttr(result, state->tag, value) == -1)
Michael J. Sullivan933e1502019-05-22 07:54:20 -07004952 goto failed;
4953 Py_DECREF(value);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08004954 break;
4955 }
4956 return result;
4957failed:
4958 Py_XDECREF(value);
4959 Py_XDECREF(result);
4960 return NULL;
4961}
4962
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004963
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004964int
Victor Stinner5cf47822020-11-02 22:03:28 +01004965obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004966{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004967 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004968
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004969 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004970 PyObject *tp;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004971
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004972 if (obj == Py_None) {
4973 *out = NULL;
4974 return 0;
4975 }
Victor Stinner74419f02020-07-03 11:35:37 +02004976 tp = state->Module_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07004977 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004978 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004979 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004980 }
4981 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01004982 asdl_stmt_seq* body;
4983 asdl_type_ignore_seq* type_ignores;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004984
Victor Stinner74419f02020-07-03 11:35:37 +02004985 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02004986 return 1;
4987 }
4988 if (tmp == NULL) {
4989 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
4990 return 1;
4991 }
4992 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004993 int res;
4994 Py_ssize_t len;
4995 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02004996 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07004997 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 +02004998 goto failed;
4999 }
5000 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005001 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005002 if (body == NULL) goto failed;
5003 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005004 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005005 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5006 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005007 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005008 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005009 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005010 if (len != PyList_GET_SIZE(tmp)) {
5011 PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration");
5012 goto failed;
5013 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005014 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005015 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005016 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005017 }
Victor Stinner74419f02020-07-03 11:35:37 +02005018 if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005019 return 1;
5020 }
5021 if (tmp == NULL) {
5022 PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module");
5023 return 1;
5024 }
5025 else {
5026 int res;
5027 Py_ssize_t len;
5028 Py_ssize_t i;
5029 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005030 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 -08005031 goto failed;
5032 }
5033 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005034 type_ignores = _Py_asdl_type_ignore_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005035 if (type_ignores == NULL) goto failed;
5036 for (i = 0; i < len; i++) {
5037 type_ignore_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005038 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5039 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005040 res = obj2ast_type_ignore(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005041 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005042 if (res != 0) goto failed;
5043 if (len != PyList_GET_SIZE(tmp)) {
5044 PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration");
5045 goto failed;
5046 }
5047 asdl_seq_SET(type_ignores, i, val);
5048 }
5049 Py_CLEAR(tmp);
5050 }
5051 *out = Module(body, type_ignores, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005052 if (*out == NULL) goto failed;
5053 return 0;
5054 }
Victor Stinner74419f02020-07-03 11:35:37 +02005055 tp = state->Interactive_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005056 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005057 if (isinstance == -1) {
5058 return 1;
5059 }
5060 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005061 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005062
Victor Stinner74419f02020-07-03 11:35:37 +02005063 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005064 return 1;
5065 }
5066 if (tmp == NULL) {
5067 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
5068 return 1;
5069 }
5070 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005071 int res;
5072 Py_ssize_t len;
5073 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005074 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005075 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 +02005076 goto failed;
5077 }
5078 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005079 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005080 if (body == NULL) goto failed;
5081 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005082 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005083 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5084 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005085 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005086 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005087 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005088 if (len != PyList_GET_SIZE(tmp)) {
5089 PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration");
5090 goto failed;
5091 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005092 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005093 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005094 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005095 }
5096 *out = Interactive(body, arena);
5097 if (*out == NULL) goto failed;
5098 return 0;
5099 }
Victor Stinner74419f02020-07-03 11:35:37 +02005100 tp = state->Expression_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005101 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005102 if (isinstance == -1) {
5103 return 1;
5104 }
5105 if (isinstance) {
5106 expr_ty body;
5107
Victor Stinner74419f02020-07-03 11:35:37 +02005108 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005109 return 1;
5110 }
5111 if (tmp == NULL) {
5112 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
5113 return 1;
5114 }
5115 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005116 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005117 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005118 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005119 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005120 }
5121 *out = Expression(body, arena);
5122 if (*out == NULL) goto failed;
5123 return 0;
5124 }
Victor Stinner74419f02020-07-03 11:35:37 +02005125 tp = state->FunctionType_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005126 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005127 if (isinstance == -1) {
5128 return 1;
5129 }
5130 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005131 asdl_expr_seq* argtypes;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005132 expr_ty returns;
5133
Victor Stinner74419f02020-07-03 11:35:37 +02005134 if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005135 return 1;
5136 }
5137 if (tmp == NULL) {
5138 PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType");
5139 return 1;
5140 }
5141 else {
5142 int res;
5143 Py_ssize_t len;
5144 Py_ssize_t i;
5145 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005146 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 -08005147 goto failed;
5148 }
5149 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005150 argtypes = _Py_asdl_expr_seq_new(len, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005151 if (argtypes == NULL) goto failed;
5152 for (i = 0; i < len; i++) {
5153 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005154 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5155 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005156 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005157 Py_DECREF(tmp2);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005158 if (res != 0) goto failed;
5159 if (len != PyList_GET_SIZE(tmp)) {
5160 PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration");
5161 goto failed;
5162 }
5163 asdl_seq_SET(argtypes, i, val);
5164 }
5165 Py_CLEAR(tmp);
5166 }
Victor Stinner74419f02020-07-03 11:35:37 +02005167 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005168 return 1;
5169 }
5170 if (tmp == NULL) {
5171 PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType");
5172 return 1;
5173 }
5174 else {
5175 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005176 res = obj2ast_expr(state, tmp, &returns, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005177 if (res != 0) goto failed;
5178 Py_CLEAR(tmp);
5179 }
5180 *out = FunctionType(argtypes, returns, arena);
5181 if (*out == NULL) goto failed;
5182 return 0;
5183 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005184
5185 PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
5186 failed:
5187 Py_XDECREF(tmp);
5188 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005189}
5190
5191int
Victor Stinner5cf47822020-11-02 22:03:28 +01005192obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena*
5193 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005194{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005195 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005196
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005197 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005198 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005199 int lineno;
5200 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005201 int end_lineno;
5202 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005203
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005204 if (obj == Py_None) {
5205 *out = NULL;
5206 return 0;
5207 }
Victor Stinner74419f02020-07-03 11:35:37 +02005208 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005209 return 1;
5210 }
5211 if (tmp == NULL) {
5212 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
5213 return 1;
5214 }
5215 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005216 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005217 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005218 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005219 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005220 }
Victor Stinner74419f02020-07-03 11:35:37 +02005221 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005222 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005223 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005224 if (tmp == NULL) {
5225 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
5226 return 1;
5227 }
5228 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005229 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005230 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005231 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005232 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005233 }
Victor Stinner74419f02020-07-03 11:35:37 +02005234 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005235 return 1;
5236 }
5237 if (tmp == NULL || tmp == Py_None) {
5238 Py_CLEAR(tmp);
5239 end_lineno = 0;
5240 }
5241 else {
5242 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005243 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005244 if (res != 0) goto failed;
5245 Py_CLEAR(tmp);
5246 }
Victor Stinner74419f02020-07-03 11:35:37 +02005247 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005248 return 1;
5249 }
5250 if (tmp == NULL || tmp == Py_None) {
5251 Py_CLEAR(tmp);
5252 end_col_offset = 0;
5253 }
5254 else {
5255 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005256 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005257 if (res != 0) goto failed;
5258 Py_CLEAR(tmp);
5259 }
Victor Stinner74419f02020-07-03 11:35:37 +02005260 tp = state->FunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005261 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005262 if (isinstance == -1) {
5263 return 1;
5264 }
5265 if (isinstance) {
5266 identifier name;
5267 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005268 asdl_stmt_seq* body;
5269 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005270 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005271 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005272
Victor Stinner74419f02020-07-03 11:35:37 +02005273 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005274 return 1;
5275 }
5276 if (tmp == NULL) {
5277 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
5278 return 1;
5279 }
5280 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005281 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005282 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005283 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005284 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005285 }
Victor Stinner74419f02020-07-03 11:35:37 +02005286 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005287 return 1;
5288 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005289 if (tmp == NULL) {
5290 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
5291 return 1;
5292 }
5293 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005294 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005295 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005296 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005297 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005298 }
Victor Stinner74419f02020-07-03 11:35:37 +02005299 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005300 return 1;
5301 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005302 if (tmp == NULL) {
5303 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
5304 return 1;
5305 }
5306 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005307 int res;
5308 Py_ssize_t len;
5309 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005310 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005311 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 +02005312 goto failed;
5313 }
5314 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005315 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005316 if (body == NULL) goto failed;
5317 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005318 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005319 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5320 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005321 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005322 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005323 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005324 if (len != PyList_GET_SIZE(tmp)) {
5325 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration");
5326 goto failed;
5327 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005328 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005329 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005330 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005331 }
Victor Stinner74419f02020-07-03 11:35:37 +02005332 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005333 return 1;
5334 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005335 if (tmp == NULL) {
5336 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
5337 return 1;
5338 }
5339 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005340 int res;
5341 Py_ssize_t len;
5342 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005343 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005344 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 +02005345 goto failed;
5346 }
5347 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005348 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005349 if (decorator_list == NULL) goto failed;
5350 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005351 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005352 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5353 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005354 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005355 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005356 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005357 if (len != PyList_GET_SIZE(tmp)) {
5358 PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration");
5359 goto failed;
5360 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005361 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005362 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005363 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005364 }
Victor Stinner74419f02020-07-03 11:35:37 +02005365 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005366 return 1;
5367 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005368 if (tmp == NULL || tmp == Py_None) {
5369 Py_CLEAR(tmp);
5370 returns = NULL;
5371 }
5372 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005373 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005374 res = obj2ast_expr(state, tmp, &returns, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005375 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005376 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005377 }
Victor Stinner74419f02020-07-03 11:35:37 +02005378 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005379 return 1;
5380 }
5381 if (tmp == NULL || tmp == Py_None) {
5382 Py_CLEAR(tmp);
5383 type_comment = NULL;
5384 }
5385 else {
5386 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005387 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005388 if (res != 0) goto failed;
5389 Py_CLEAR(tmp);
5390 }
5391 *out = FunctionDef(name, args, body, decorator_list, returns,
5392 type_comment, lineno, col_offset, end_lineno,
5393 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005394 if (*out == NULL) goto failed;
5395 return 0;
5396 }
Victor Stinner74419f02020-07-03 11:35:37 +02005397 tp = state->AsyncFunctionDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005398 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04005399 if (isinstance == -1) {
5400 return 1;
5401 }
5402 if (isinstance) {
5403 identifier name;
5404 arguments_ty args;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005405 asdl_stmt_seq* body;
5406 asdl_expr_seq* decorator_list;
Yury Selivanov75445082015-05-11 22:57:16 -04005407 expr_ty returns;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005408 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04005409
Victor Stinner74419f02020-07-03 11:35:37 +02005410 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005411 return 1;
5412 }
5413 if (tmp == NULL) {
5414 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from AsyncFunctionDef");
5415 return 1;
5416 }
5417 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005418 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005419 res = obj2ast_identifier(state, tmp, &name, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005420 if (res != 0) goto failed;
5421 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005422 }
Victor Stinner74419f02020-07-03 11:35:37 +02005423 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005424 return 1;
5425 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005426 if (tmp == NULL) {
5427 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from AsyncFunctionDef");
5428 return 1;
5429 }
5430 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005431 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005432 res = obj2ast_arguments(state, tmp, &args, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005433 if (res != 0) goto failed;
5434 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005435 }
Victor Stinner74419f02020-07-03 11:35:37 +02005436 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005437 return 1;
5438 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005439 if (tmp == NULL) {
5440 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFunctionDef");
5441 return 1;
5442 }
5443 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005444 int res;
5445 Py_ssize_t len;
5446 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005447 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005448 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 -04005449 goto failed;
5450 }
5451 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005452 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005453 if (body == NULL) goto failed;
5454 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005455 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005456 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5457 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005458 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005459 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005460 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005461 if (len != PyList_GET_SIZE(tmp)) {
5462 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration");
5463 goto failed;
5464 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005465 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005466 }
5467 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005468 }
Victor Stinner74419f02020-07-03 11:35:37 +02005469 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005470 return 1;
5471 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005472 if (tmp == NULL) {
5473 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from AsyncFunctionDef");
5474 return 1;
5475 }
5476 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005477 int res;
5478 Py_ssize_t len;
5479 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04005480 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005481 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 -04005482 goto failed;
5483 }
5484 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005485 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005486 if (decorator_list == NULL) goto failed;
5487 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005488 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005489 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5490 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005491 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005492 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04005493 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005494 if (len != PyList_GET_SIZE(tmp)) {
5495 PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration");
5496 goto failed;
5497 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005498 asdl_seq_SET(decorator_list, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04005499 }
5500 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005501 }
Victor Stinner74419f02020-07-03 11:35:37 +02005502 if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04005503 return 1;
5504 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005505 if (tmp == NULL || tmp == Py_None) {
5506 Py_CLEAR(tmp);
5507 returns = NULL;
5508 }
5509 else {
Yury Selivanov75445082015-05-11 22:57:16 -04005510 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005511 res = obj2ast_expr(state, tmp, &returns, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005512 if (res != 0) goto failed;
5513 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04005514 }
Victor Stinner74419f02020-07-03 11:35:37 +02005515 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005516 return 1;
5517 }
5518 if (tmp == NULL || tmp == Py_None) {
5519 Py_CLEAR(tmp);
5520 type_comment = NULL;
5521 }
5522 else {
5523 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005524 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005525 if (res != 0) goto failed;
5526 Py_CLEAR(tmp);
5527 }
Yury Selivanov75445082015-05-11 22:57:16 -04005528 *out = AsyncFunctionDef(name, args, body, decorator_list, returns,
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005529 type_comment, lineno, col_offset, end_lineno,
5530 end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04005531 if (*out == NULL) goto failed;
5532 return 0;
5533 }
Victor Stinner74419f02020-07-03 11:35:37 +02005534 tp = state->ClassDef_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005535 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005536 if (isinstance == -1) {
5537 return 1;
5538 }
5539 if (isinstance) {
5540 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005541 asdl_expr_seq* bases;
5542 asdl_keyword_seq* keywords;
5543 asdl_stmt_seq* body;
5544 asdl_expr_seq* decorator_list;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005545
Victor Stinner74419f02020-07-03 11:35:37 +02005546 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005547 return 1;
5548 }
5549 if (tmp == NULL) {
5550 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
5551 return 1;
5552 }
5553 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005554 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005555 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005556 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005557 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005558 }
Victor Stinner74419f02020-07-03 11:35:37 +02005559 if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005560 return 1;
5561 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005562 if (tmp == NULL) {
5563 PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
5564 return 1;
5565 }
5566 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005567 int res;
5568 Py_ssize_t len;
5569 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005570 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005571 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 +02005572 goto failed;
5573 }
5574 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005575 bases = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005576 if (bases == NULL) goto failed;
5577 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005578 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005579 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5580 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005581 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005582 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005583 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005584 if (len != PyList_GET_SIZE(tmp)) {
5585 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration");
5586 goto failed;
5587 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005588 asdl_seq_SET(bases, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005589 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005590 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005591 }
Victor Stinner74419f02020-07-03 11:35:37 +02005592 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005593 return 1;
5594 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005595 if (tmp == NULL) {
5596 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
5597 return 1;
5598 }
5599 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005600 int res;
5601 Py_ssize_t len;
5602 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005603 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005604 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 +02005605 goto failed;
5606 }
5607 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005608 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005609 if (keywords == NULL) goto failed;
5610 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005611 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005612 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5613 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005614 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005615 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005616 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005617 if (len != PyList_GET_SIZE(tmp)) {
5618 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration");
5619 goto failed;
5620 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005621 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005622 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005623 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005624 }
Victor Stinner74419f02020-07-03 11:35:37 +02005625 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005626 return 1;
5627 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005628 if (tmp == NULL) {
5629 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
5630 return 1;
5631 }
5632 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005633 int res;
5634 Py_ssize_t len;
5635 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005636 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005637 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 +02005638 goto failed;
5639 }
5640 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005641 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005642 if (body == NULL) goto failed;
5643 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005644 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005645 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5646 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005647 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005648 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005649 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005650 if (len != PyList_GET_SIZE(tmp)) {
5651 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration");
5652 goto failed;
5653 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005654 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005655 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005656 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005657 }
Victor Stinner74419f02020-07-03 11:35:37 +02005658 if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005659 return 1;
5660 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005661 if (tmp == NULL) {
5662 PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
5663 return 1;
5664 }
5665 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005666 int res;
5667 Py_ssize_t len;
5668 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005669 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005670 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 +02005671 goto failed;
5672 }
5673 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005674 decorator_list = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005675 if (decorator_list == NULL) goto failed;
5676 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005677 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005678 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5679 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005680 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005681 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005682 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005683 if (len != PyList_GET_SIZE(tmp)) {
5684 PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration");
5685 goto failed;
5686 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005687 asdl_seq_SET(decorator_list, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005688 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005689 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005690 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03005691 *out = ClassDef(name, bases, keywords, body, decorator_list, lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005692 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005693 if (*out == NULL) goto failed;
5694 return 0;
5695 }
Victor Stinner74419f02020-07-03 11:35:37 +02005696 tp = state->Return_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005697 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005698 if (isinstance == -1) {
5699 return 1;
5700 }
5701 if (isinstance) {
5702 expr_ty value;
5703
Victor Stinner74419f02020-07-03 11:35:37 +02005704 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005705 return 1;
5706 }
5707 if (tmp == NULL || tmp == Py_None) {
5708 Py_CLEAR(tmp);
5709 value = NULL;
5710 }
5711 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005712 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005713 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005714 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005715 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005716 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005717 *out = Return(value, lineno, col_offset, end_lineno, end_col_offset,
5718 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005719 if (*out == NULL) goto failed;
5720 return 0;
5721 }
Victor Stinner74419f02020-07-03 11:35:37 +02005722 tp = state->Delete_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005723 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005724 if (isinstance == -1) {
5725 return 1;
5726 }
5727 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005728 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005729
Victor Stinner74419f02020-07-03 11:35:37 +02005730 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005731 return 1;
5732 }
5733 if (tmp == NULL) {
5734 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
5735 return 1;
5736 }
5737 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005738 int res;
5739 Py_ssize_t len;
5740 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005741 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005742 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 +02005743 goto failed;
5744 }
5745 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005746 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005747 if (targets == NULL) goto failed;
5748 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005749 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005750 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5751 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005752 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005753 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005754 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005755 if (len != PyList_GET_SIZE(tmp)) {
5756 PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration");
5757 goto failed;
5758 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005759 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005760 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005761 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005762 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005763 *out = Delete(targets, lineno, col_offset, end_lineno, end_col_offset,
5764 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005765 if (*out == NULL) goto failed;
5766 return 0;
5767 }
Victor Stinner74419f02020-07-03 11:35:37 +02005768 tp = state->Assign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005769 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005770 if (isinstance == -1) {
5771 return 1;
5772 }
5773 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01005774 asdl_expr_seq* targets;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005775 expr_ty value;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005776 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005777
Victor Stinner74419f02020-07-03 11:35:37 +02005778 if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005779 return 1;
5780 }
5781 if (tmp == NULL) {
5782 PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
5783 return 1;
5784 }
5785 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005786 int res;
5787 Py_ssize_t len;
5788 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005789 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07005790 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 +02005791 goto failed;
5792 }
5793 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01005794 targets = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005795 if (targets == NULL) goto failed;
5796 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005797 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005798 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
5799 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02005800 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03005801 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005802 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03005803 if (len != PyList_GET_SIZE(tmp)) {
5804 PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration");
5805 goto failed;
5806 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07005807 asdl_seq_SET(targets, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005808 }
Victor Stinner1acc1292013-07-27 00:03:47 +02005809 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005810 }
Victor Stinner74419f02020-07-03 11:35:37 +02005811 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005812 return 1;
5813 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005814 if (tmp == NULL) {
5815 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
5816 return 1;
5817 }
5818 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005819 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005820 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005821 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005822 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005823 }
Victor Stinner74419f02020-07-03 11:35:37 +02005824 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005825 return 1;
5826 }
5827 if (tmp == NULL || tmp == Py_None) {
5828 Py_CLEAR(tmp);
5829 type_comment = NULL;
5830 }
5831 else {
5832 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005833 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005834 if (res != 0) goto failed;
5835 Py_CLEAR(tmp);
5836 }
5837 *out = Assign(targets, value, type_comment, lineno, col_offset,
5838 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005839 if (*out == NULL) goto failed;
5840 return 0;
5841 }
Victor Stinner74419f02020-07-03 11:35:37 +02005842 tp = state->AugAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005843 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005844 if (isinstance == -1) {
5845 return 1;
5846 }
5847 if (isinstance) {
5848 expr_ty target;
5849 operator_ty op;
5850 expr_ty value;
5851
Victor Stinner74419f02020-07-03 11:35:37 +02005852 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005853 return 1;
5854 }
5855 if (tmp == NULL) {
5856 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
5857 return 1;
5858 }
5859 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005860 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005861 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005862 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005863 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005864 }
Victor Stinner74419f02020-07-03 11:35:37 +02005865 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005866 return 1;
5867 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005868 if (tmp == NULL) {
5869 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
5870 return 1;
5871 }
5872 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005873 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005874 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005875 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005876 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005877 }
Victor Stinner74419f02020-07-03 11:35:37 +02005878 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005879 return 1;
5880 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005881 if (tmp == NULL) {
5882 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
5883 return 1;
5884 }
5885 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005886 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005887 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005888 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005889 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005890 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005891 *out = AugAssign(target, op, value, lineno, col_offset, end_lineno,
5892 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005893 if (*out == NULL) goto failed;
5894 return 0;
5895 }
Victor Stinner74419f02020-07-03 11:35:37 +02005896 tp = state->AnnAssign_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005897 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005898 if (isinstance == -1) {
5899 return 1;
5900 }
5901 if (isinstance) {
5902 expr_ty target;
5903 expr_ty annotation;
5904 expr_ty value;
5905 int simple;
5906
Victor Stinner74419f02020-07-03 11:35:37 +02005907 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005908 return 1;
5909 }
5910 if (tmp == NULL) {
5911 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AnnAssign");
5912 return 1;
5913 }
5914 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005915 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005916 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005917 if (res != 0) goto failed;
5918 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005919 }
Victor Stinner74419f02020-07-03 11:35:37 +02005920 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005921 return 1;
5922 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005923 if (tmp == NULL) {
5924 PyErr_SetString(PyExc_TypeError, "required field \"annotation\" missing from AnnAssign");
5925 return 1;
5926 }
5927 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005928 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005929 res = obj2ast_expr(state, tmp, &annotation, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005930 if (res != 0) goto failed;
5931 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005932 }
Victor Stinner74419f02020-07-03 11:35:37 +02005933 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005934 return 1;
5935 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005936 if (tmp == NULL || tmp == Py_None) {
5937 Py_CLEAR(tmp);
5938 value = NULL;
5939 }
5940 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005941 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005942 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005943 if (res != 0) goto failed;
5944 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005945 }
Victor Stinner74419f02020-07-03 11:35:37 +02005946 if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005947 return 1;
5948 }
5949 if (tmp == NULL) {
5950 PyErr_SetString(PyExc_TypeError, "required field \"simple\" missing from AnnAssign");
5951 return 1;
5952 }
5953 else {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005954 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005955 res = obj2ast_int(state, tmp, &simple, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005956 if (res != 0) goto failed;
5957 Py_CLEAR(tmp);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005958 }
5959 *out = AnnAssign(target, annotation, value, simple, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00005960 end_lineno, end_col_offset, arena);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005961 if (*out == NULL) goto failed;
5962 return 0;
5963 }
Victor Stinner74419f02020-07-03 11:35:37 +02005964 tp = state->For_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07005965 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005966 if (isinstance == -1) {
5967 return 1;
5968 }
5969 if (isinstance) {
5970 expr_ty target;
5971 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01005972 asdl_stmt_seq* body;
5973 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08005974 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005975
Victor Stinner74419f02020-07-03 11:35:37 +02005976 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005977 return 1;
5978 }
5979 if (tmp == NULL) {
5980 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
5981 return 1;
5982 }
5983 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005984 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005985 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005986 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02005987 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005988 }
Victor Stinner74419f02020-07-03 11:35:37 +02005989 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005990 return 1;
5991 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02005992 if (tmp == NULL) {
5993 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
5994 return 1;
5995 }
5996 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005997 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02005998 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02005999 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006000 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006001 }
Victor Stinner74419f02020-07-03 11:35:37 +02006002 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006003 return 1;
6004 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006005 if (tmp == NULL) {
6006 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
6007 return 1;
6008 }
6009 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006010 int res;
6011 Py_ssize_t len;
6012 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006013 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006014 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 +02006015 goto failed;
6016 }
6017 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006018 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006019 if (body == NULL) goto failed;
6020 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006021 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006022 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6023 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006024 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006025 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006026 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006027 if (len != PyList_GET_SIZE(tmp)) {
6028 PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration");
6029 goto failed;
6030 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006031 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006032 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006033 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006034 }
Victor Stinner74419f02020-07-03 11:35:37 +02006035 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006036 return 1;
6037 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006038 if (tmp == NULL) {
6039 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
6040 return 1;
6041 }
6042 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006043 int res;
6044 Py_ssize_t len;
6045 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006046 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006047 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 +02006048 goto failed;
6049 }
6050 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006051 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006052 if (orelse == NULL) goto failed;
6053 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006054 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006055 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6056 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006057 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006058 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006059 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006060 if (len != PyList_GET_SIZE(tmp)) {
6061 PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration");
6062 goto failed;
6063 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006064 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006065 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006066 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006067 }
Victor Stinner74419f02020-07-03 11:35:37 +02006068 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006069 return 1;
6070 }
6071 if (tmp == NULL || tmp == Py_None) {
6072 Py_CLEAR(tmp);
6073 type_comment = NULL;
6074 }
6075 else {
6076 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006077 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006078 if (res != 0) goto failed;
6079 Py_CLEAR(tmp);
6080 }
6081 *out = For(target, iter, body, orelse, type_comment, lineno,
6082 col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006083 if (*out == NULL) goto failed;
6084 return 0;
6085 }
Victor Stinner74419f02020-07-03 11:35:37 +02006086 tp = state->AsyncFor_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006087 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006088 if (isinstance == -1) {
6089 return 1;
6090 }
6091 if (isinstance) {
6092 expr_ty target;
6093 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006094 asdl_stmt_seq* body;
6095 asdl_stmt_seq* orelse;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006096 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006097
Victor Stinner74419f02020-07-03 11:35:37 +02006098 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006099 return 1;
6100 }
6101 if (tmp == NULL) {
6102 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AsyncFor");
6103 return 1;
6104 }
6105 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006106 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006107 res = obj2ast_expr(state, tmp, &target, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006108 if (res != 0) goto failed;
6109 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006110 }
Victor Stinner74419f02020-07-03 11:35:37 +02006111 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006112 return 1;
6113 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006114 if (tmp == NULL) {
6115 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from AsyncFor");
6116 return 1;
6117 }
6118 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006119 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006120 res = obj2ast_expr(state, tmp, &iter, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006121 if (res != 0) goto failed;
6122 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006123 }
Victor Stinner74419f02020-07-03 11:35:37 +02006124 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006125 return 1;
6126 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006127 if (tmp == NULL) {
6128 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncFor");
6129 return 1;
6130 }
6131 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006132 int res;
6133 Py_ssize_t len;
6134 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006135 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006136 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 -04006137 goto failed;
6138 }
6139 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006140 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006141 if (body == NULL) goto failed;
6142 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006143 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006144 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6145 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006146 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006147 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006148 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006149 if (len != PyList_GET_SIZE(tmp)) {
6150 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration");
6151 goto failed;
6152 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006153 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006154 }
6155 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006156 }
Victor Stinner74419f02020-07-03 11:35:37 +02006157 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006158 return 1;
6159 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006160 if (tmp == NULL) {
6161 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from AsyncFor");
6162 return 1;
6163 }
6164 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006165 int res;
6166 Py_ssize_t len;
6167 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006168 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006169 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 -04006170 goto failed;
6171 }
6172 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006173 orelse = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006174 if (orelse == NULL) goto failed;
6175 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006176 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006177 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6178 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006179 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006180 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006181 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006182 if (len != PyList_GET_SIZE(tmp)) {
6183 PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration");
6184 goto failed;
6185 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006186 asdl_seq_SET(orelse, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006187 }
6188 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006189 }
Victor Stinner74419f02020-07-03 11:35:37 +02006190 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006191 return 1;
6192 }
6193 if (tmp == NULL || tmp == Py_None) {
6194 Py_CLEAR(tmp);
6195 type_comment = NULL;
6196 }
6197 else {
6198 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006199 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006200 if (res != 0) goto failed;
6201 Py_CLEAR(tmp);
6202 }
6203 *out = AsyncFor(target, iter, body, orelse, type_comment, lineno,
6204 col_offset, end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006205 if (*out == NULL) goto failed;
6206 return 0;
6207 }
Victor Stinner74419f02020-07-03 11:35:37 +02006208 tp = state->While_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006209 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006210 if (isinstance == -1) {
6211 return 1;
6212 }
6213 if (isinstance) {
6214 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006215 asdl_stmt_seq* body;
6216 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006217
Victor Stinner74419f02020-07-03 11:35:37 +02006218 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006219 return 1;
6220 }
6221 if (tmp == NULL) {
6222 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
6223 return 1;
6224 }
6225 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006226 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006227 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006228 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006229 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006230 }
Victor Stinner74419f02020-07-03 11:35:37 +02006231 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006232 return 1;
6233 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006234 if (tmp == NULL) {
6235 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
6236 return 1;
6237 }
6238 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006239 int res;
6240 Py_ssize_t len;
6241 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006242 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006243 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 +02006244 goto failed;
6245 }
6246 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006247 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006248 if (body == NULL) goto failed;
6249 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006250 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006251 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6252 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006253 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006254 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006255 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006256 if (len != PyList_GET_SIZE(tmp)) {
6257 PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration");
6258 goto failed;
6259 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006260 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006261 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006262 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006263 }
Victor Stinner74419f02020-07-03 11:35:37 +02006264 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006265 return 1;
6266 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006267 if (tmp == NULL) {
6268 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
6269 return 1;
6270 }
6271 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006272 int res;
6273 Py_ssize_t len;
6274 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006275 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006276 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 +02006277 goto failed;
6278 }
6279 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006280 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006281 if (orelse == NULL) goto failed;
6282 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006283 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006284 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6285 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006286 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006287 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006288 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006289 if (len != PyList_GET_SIZE(tmp)) {
6290 PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration");
6291 goto failed;
6292 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006293 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006294 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006295 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006296 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006297 *out = While(test, body, orelse, lineno, col_offset, end_lineno,
6298 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006299 if (*out == NULL) goto failed;
6300 return 0;
6301 }
Victor Stinner74419f02020-07-03 11:35:37 +02006302 tp = state->If_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006303 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006304 if (isinstance == -1) {
6305 return 1;
6306 }
6307 if (isinstance) {
6308 expr_ty test;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006309 asdl_stmt_seq* body;
6310 asdl_stmt_seq* orelse;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006311
Victor Stinner74419f02020-07-03 11:35:37 +02006312 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006313 return 1;
6314 }
6315 if (tmp == NULL) {
6316 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
6317 return 1;
6318 }
6319 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006320 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006321 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006322 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006323 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006324 }
Victor Stinner74419f02020-07-03 11:35:37 +02006325 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006326 return 1;
6327 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006328 if (tmp == NULL) {
6329 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
6330 return 1;
6331 }
6332 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006333 int res;
6334 Py_ssize_t len;
6335 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006336 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006337 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 +02006338 goto failed;
6339 }
6340 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006341 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006342 if (body == NULL) goto failed;
6343 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006344 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006345 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6346 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006347 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006348 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006349 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006350 if (len != PyList_GET_SIZE(tmp)) {
6351 PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration");
6352 goto failed;
6353 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006354 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006355 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006356 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006357 }
Victor Stinner74419f02020-07-03 11:35:37 +02006358 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006359 return 1;
6360 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006361 if (tmp == NULL) {
6362 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
6363 return 1;
6364 }
6365 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006366 int res;
6367 Py_ssize_t len;
6368 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006369 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006370 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 +02006371 goto failed;
6372 }
6373 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006374 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006375 if (orelse == NULL) goto failed;
6376 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006377 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006378 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6379 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006380 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006381 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006382 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006383 if (len != PyList_GET_SIZE(tmp)) {
6384 PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration");
6385 goto failed;
6386 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006387 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006388 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006389 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006390 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006391 *out = If(test, body, orelse, lineno, col_offset, end_lineno,
6392 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006393 if (*out == NULL) goto failed;
6394 return 0;
6395 }
Victor Stinner74419f02020-07-03 11:35:37 +02006396 tp = state->With_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006397 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006398 if (isinstance == -1) {
6399 return 1;
6400 }
6401 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006402 asdl_withitem_seq* items;
6403 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006404 string type_comment;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006405
Victor Stinner74419f02020-07-03 11:35:37 +02006406 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006407 return 1;
6408 }
6409 if (tmp == NULL) {
6410 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
6411 return 1;
6412 }
6413 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006414 int res;
6415 Py_ssize_t len;
6416 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006417 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006418 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 +02006419 goto failed;
6420 }
6421 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006422 items = _Py_asdl_withitem_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006423 if (items == NULL) goto failed;
6424 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006425 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006426 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6427 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006428 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006429 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006430 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006431 if (len != PyList_GET_SIZE(tmp)) {
6432 PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration");
6433 goto failed;
6434 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006435 asdl_seq_SET(items, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006436 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006437 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006438 }
Victor Stinner74419f02020-07-03 11:35:37 +02006439 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006440 return 1;
6441 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006442 if (tmp == NULL) {
6443 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
6444 return 1;
6445 }
6446 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006447 int res;
6448 Py_ssize_t len;
6449 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006450 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006451 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 +02006452 goto failed;
6453 }
6454 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006455 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006456 if (body == NULL) goto failed;
6457 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006458 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006459 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6460 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006461 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006462 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006463 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006464 if (len != PyList_GET_SIZE(tmp)) {
6465 PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration");
6466 goto failed;
6467 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006468 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006469 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006470 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006471 }
Victor Stinner74419f02020-07-03 11:35:37 +02006472 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006473 return 1;
6474 }
6475 if (tmp == NULL || tmp == Py_None) {
6476 Py_CLEAR(tmp);
6477 type_comment = NULL;
6478 }
6479 else {
6480 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006481 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006482 if (res != 0) goto failed;
6483 Py_CLEAR(tmp);
6484 }
6485 *out = With(items, body, type_comment, lineno, col_offset, end_lineno,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006486 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006487 if (*out == NULL) goto failed;
6488 return 0;
6489 }
Victor Stinner74419f02020-07-03 11:35:37 +02006490 tp = state->AsyncWith_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006491 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04006492 if (isinstance == -1) {
6493 return 1;
6494 }
6495 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006496 asdl_withitem_seq* items;
6497 asdl_stmt_seq* body;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006498 string type_comment;
Yury Selivanov75445082015-05-11 22:57:16 -04006499
Victor Stinner74419f02020-07-03 11:35:37 +02006500 if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006501 return 1;
6502 }
6503 if (tmp == NULL) {
6504 PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from AsyncWith");
6505 return 1;
6506 }
6507 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006508 int res;
6509 Py_ssize_t len;
6510 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006511 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006512 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 -04006513 goto failed;
6514 }
6515 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006516 items = _Py_asdl_withitem_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006517 if (items == NULL) goto failed;
6518 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006519 withitem_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006520 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6521 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006522 res = obj2ast_withitem(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006523 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006524 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006525 if (len != PyList_GET_SIZE(tmp)) {
6526 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration");
6527 goto failed;
6528 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006529 asdl_seq_SET(items, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006530 }
6531 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006532 }
Victor Stinner74419f02020-07-03 11:35:37 +02006533 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Yury Selivanov75445082015-05-11 22:57:16 -04006534 return 1;
6535 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006536 if (tmp == NULL) {
6537 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from AsyncWith");
6538 return 1;
6539 }
6540 else {
Yury Selivanov75445082015-05-11 22:57:16 -04006541 int res;
6542 Py_ssize_t len;
6543 Py_ssize_t i;
Yury Selivanov75445082015-05-11 22:57:16 -04006544 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006545 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 -04006546 goto failed;
6547 }
6548 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006549 body = _Py_asdl_stmt_seq_new(len, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006550 if (body == NULL) goto failed;
6551 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006552 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006553 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6554 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006555 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006556 Py_DECREF(tmp2);
Yury Selivanov75445082015-05-11 22:57:16 -04006557 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006558 if (len != PyList_GET_SIZE(tmp)) {
6559 PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration");
6560 goto failed;
6561 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006562 asdl_seq_SET(body, i, val);
Yury Selivanov75445082015-05-11 22:57:16 -04006563 }
6564 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04006565 }
Victor Stinner74419f02020-07-03 11:35:37 +02006566 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006567 return 1;
6568 }
6569 if (tmp == NULL || tmp == Py_None) {
6570 Py_CLEAR(tmp);
6571 type_comment = NULL;
6572 }
6573 else {
6574 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006575 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08006576 if (res != 0) goto failed;
6577 Py_CLEAR(tmp);
6578 }
6579 *out = AsyncWith(items, body, type_comment, lineno, col_offset,
6580 end_lineno, end_col_offset, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04006581 if (*out == NULL) goto failed;
6582 return 0;
6583 }
Victor Stinner74419f02020-07-03 11:35:37 +02006584 tp = state->Raise_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006585 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006586 if (isinstance == -1) {
6587 return 1;
6588 }
6589 if (isinstance) {
6590 expr_ty exc;
6591 expr_ty cause;
6592
Victor Stinner74419f02020-07-03 11:35:37 +02006593 if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006594 return 1;
6595 }
6596 if (tmp == NULL || tmp == Py_None) {
6597 Py_CLEAR(tmp);
6598 exc = NULL;
6599 }
6600 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006601 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006602 res = obj2ast_expr(state, tmp, &exc, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006603 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006604 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006605 }
Victor Stinner74419f02020-07-03 11:35:37 +02006606 if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006607 return 1;
6608 }
6609 if (tmp == NULL || tmp == Py_None) {
6610 Py_CLEAR(tmp);
6611 cause = NULL;
6612 }
6613 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006614 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006615 res = obj2ast_expr(state, tmp, &cause, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006616 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006617 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006618 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006619 *out = Raise(exc, cause, lineno, col_offset, end_lineno,
6620 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006621 if (*out == NULL) goto failed;
6622 return 0;
6623 }
Victor Stinner74419f02020-07-03 11:35:37 +02006624 tp = state->Try_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006625 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006626 if (isinstance == -1) {
6627 return 1;
6628 }
6629 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006630 asdl_stmt_seq* body;
6631 asdl_excepthandler_seq* handlers;
6632 asdl_stmt_seq* orelse;
6633 asdl_stmt_seq* finalbody;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006634
Victor Stinner74419f02020-07-03 11:35:37 +02006635 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006636 return 1;
6637 }
6638 if (tmp == NULL) {
6639 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
6640 return 1;
6641 }
6642 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006643 int res;
6644 Py_ssize_t len;
6645 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006646 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006647 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 +02006648 goto failed;
6649 }
6650 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006651 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006652 if (body == NULL) goto failed;
6653 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006654 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006655 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6656 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006657 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006658 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006659 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006660 if (len != PyList_GET_SIZE(tmp)) {
6661 PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration");
6662 goto failed;
6663 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006664 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006665 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006666 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006667 }
Victor Stinner74419f02020-07-03 11:35:37 +02006668 if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006669 return 1;
6670 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006671 if (tmp == NULL) {
6672 PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
6673 return 1;
6674 }
6675 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006676 int res;
6677 Py_ssize_t len;
6678 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006679 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006680 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 +02006681 goto failed;
6682 }
6683 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006684 handlers = _Py_asdl_excepthandler_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006685 if (handlers == NULL) goto failed;
6686 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006687 excepthandler_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006688 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6689 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006690 res = obj2ast_excepthandler(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006691 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006692 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006693 if (len != PyList_GET_SIZE(tmp)) {
6694 PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration");
6695 goto failed;
6696 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006697 asdl_seq_SET(handlers, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006698 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006699 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006700 }
Victor Stinner74419f02020-07-03 11:35:37 +02006701 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006702 return 1;
6703 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006704 if (tmp == NULL) {
6705 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
6706 return 1;
6707 }
6708 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006709 int res;
6710 Py_ssize_t len;
6711 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006712 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006713 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 +02006714 goto failed;
6715 }
6716 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006717 orelse = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006718 if (orelse == NULL) goto failed;
6719 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006720 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006721 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6722 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006723 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006724 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006725 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006726 if (len != PyList_GET_SIZE(tmp)) {
6727 PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration");
6728 goto failed;
6729 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006730 asdl_seq_SET(orelse, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006731 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006732 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006733 }
Victor Stinner74419f02020-07-03 11:35:37 +02006734 if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006735 return 1;
6736 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006737 if (tmp == NULL) {
6738 PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
6739 return 1;
6740 }
6741 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006742 int res;
6743 Py_ssize_t len;
6744 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006745 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006746 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 +02006747 goto failed;
6748 }
6749 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006750 finalbody = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006751 if (finalbody == NULL) goto failed;
6752 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006753 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006754 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6755 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006756 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006757 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006758 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006759 if (len != PyList_GET_SIZE(tmp)) {
6760 PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration");
6761 goto failed;
6762 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006763 asdl_seq_SET(finalbody, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006764 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006765 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006766 }
6767 *out = Try(body, handlers, orelse, finalbody, lineno, col_offset,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006768 end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006769 if (*out == NULL) goto failed;
6770 return 0;
6771 }
Victor Stinner74419f02020-07-03 11:35:37 +02006772 tp = state->Assert_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006773 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006774 if (isinstance == -1) {
6775 return 1;
6776 }
6777 if (isinstance) {
6778 expr_ty test;
6779 expr_ty msg;
6780
Victor Stinner74419f02020-07-03 11:35:37 +02006781 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006782 return 1;
6783 }
6784 if (tmp == NULL) {
6785 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
6786 return 1;
6787 }
6788 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006789 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006790 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006791 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006792 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006793 }
Victor Stinner74419f02020-07-03 11:35:37 +02006794 if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006795 return 1;
6796 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006797 if (tmp == NULL || tmp == Py_None) {
6798 Py_CLEAR(tmp);
6799 msg = NULL;
6800 }
6801 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006802 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006803 res = obj2ast_expr(state, tmp, &msg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006804 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006805 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006806 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006807 *out = Assert(test, msg, lineno, col_offset, end_lineno,
6808 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006809 if (*out == NULL) goto failed;
6810 return 0;
6811 }
Victor Stinner74419f02020-07-03 11:35:37 +02006812 tp = state->Import_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006813 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006814 if (isinstance == -1) {
6815 return 1;
6816 }
6817 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006818 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006819
Victor Stinner74419f02020-07-03 11:35:37 +02006820 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006821 return 1;
6822 }
6823 if (tmp == NULL) {
6824 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
6825 return 1;
6826 }
6827 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006828 int res;
6829 Py_ssize_t len;
6830 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006831 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006832 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 +02006833 goto failed;
6834 }
6835 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006836 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006837 if (names == NULL) goto failed;
6838 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006839 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006840 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6841 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006842 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006843 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006844 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006845 if (len != PyList_GET_SIZE(tmp)) {
6846 PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration");
6847 goto failed;
6848 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006849 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006850 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006851 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006852 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006853 *out = Import(names, lineno, col_offset, end_lineno, end_col_offset,
6854 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006855 if (*out == NULL) goto failed;
6856 return 0;
6857 }
Victor Stinner74419f02020-07-03 11:35:37 +02006858 tp = state->ImportFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006859 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006860 if (isinstance == -1) {
6861 return 1;
6862 }
6863 if (isinstance) {
6864 identifier module;
Pablo Galindoa5634c42020-09-16 19:42:00 +01006865 asdl_alias_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006866 int level;
6867
Victor Stinner74419f02020-07-03 11:35:37 +02006868 if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006869 return 1;
6870 }
6871 if (tmp == NULL || tmp == Py_None) {
6872 Py_CLEAR(tmp);
6873 module = NULL;
6874 }
6875 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006876 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006877 res = obj2ast_identifier(state, tmp, &module, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006878 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006879 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006880 }
Victor Stinner74419f02020-07-03 11:35:37 +02006881 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006882 return 1;
6883 }
6884 if (tmp == NULL) {
6885 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
6886 return 1;
6887 }
6888 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006889 int res;
6890 Py_ssize_t len;
6891 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006892 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006893 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 +02006894 goto failed;
6895 }
6896 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006897 names = _Py_asdl_alias_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006898 if (names == NULL) goto failed;
6899 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006900 alias_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006901 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6902 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006903 res = obj2ast_alias(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006904 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006905 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006906 if (len != PyList_GET_SIZE(tmp)) {
6907 PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration");
6908 goto failed;
6909 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006910 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006911 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006912 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006913 }
Victor Stinner74419f02020-07-03 11:35:37 +02006914 if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006915 return 1;
6916 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006917 if (tmp == NULL || tmp == Py_None) {
6918 Py_CLEAR(tmp);
6919 level = 0;
6920 }
6921 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006922 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02006923 res = obj2ast_int(state, tmp, &level, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006924 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02006925 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006926 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006927 *out = ImportFrom(module, names, level, lineno, col_offset, end_lineno,
6928 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006929 if (*out == NULL) goto failed;
6930 return 0;
6931 }
Victor Stinner74419f02020-07-03 11:35:37 +02006932 tp = state->Global_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006933 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006934 if (isinstance == -1) {
6935 return 1;
6936 }
6937 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006938 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006939
Victor Stinner74419f02020-07-03 11:35:37 +02006940 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006941 return 1;
6942 }
6943 if (tmp == NULL) {
6944 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
6945 return 1;
6946 }
6947 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006948 int res;
6949 Py_ssize_t len;
6950 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006951 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006952 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 +02006953 goto failed;
6954 }
6955 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01006956 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006957 if (names == NULL) goto failed;
6958 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006959 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006960 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
6961 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02006962 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03006963 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006964 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03006965 if (len != PyList_GET_SIZE(tmp)) {
6966 PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration");
6967 goto failed;
6968 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07006969 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006970 }
Victor Stinner1acc1292013-07-27 00:03:47 +02006971 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006972 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00006973 *out = Global(names, lineno, col_offset, end_lineno, end_col_offset,
6974 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006975 if (*out == NULL) goto failed;
6976 return 0;
6977 }
Victor Stinner74419f02020-07-03 11:35:37 +02006978 tp = state->Nonlocal_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07006979 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006980 if (isinstance == -1) {
6981 return 1;
6982 }
6983 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01006984 asdl_identifier_seq* names;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006985
Victor Stinner74419f02020-07-03 11:35:37 +02006986 if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02006987 return 1;
6988 }
6989 if (tmp == NULL) {
6990 PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
6991 return 1;
6992 }
6993 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006994 int res;
6995 Py_ssize_t len;
6996 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02006997 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07006998 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 +02006999 goto failed;
7000 }
7001 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007002 names = _Py_asdl_identifier_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007003 if (names == NULL) goto failed;
7004 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007005 identifier val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007006 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7007 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007008 res = obj2ast_identifier(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007009 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007010 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007011 if (len != PyList_GET_SIZE(tmp)) {
7012 PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration");
7013 goto failed;
7014 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007015 asdl_seq_SET(names, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007016 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007017 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007018 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007019 *out = Nonlocal(names, lineno, col_offset, end_lineno, end_col_offset,
7020 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007021 if (*out == NULL) goto failed;
7022 return 0;
7023 }
Victor Stinner74419f02020-07-03 11:35:37 +02007024 tp = state->Expr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007025 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007026 if (isinstance == -1) {
7027 return 1;
7028 }
7029 if (isinstance) {
7030 expr_ty value;
7031
Victor Stinner74419f02020-07-03 11:35:37 +02007032 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007033 return 1;
7034 }
7035 if (tmp == NULL) {
7036 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
7037 return 1;
7038 }
7039 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007040 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007041 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007042 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007043 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007044 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007045 *out = Expr(value, lineno, col_offset, end_lineno, end_col_offset,
7046 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007047 if (*out == NULL) goto failed;
7048 return 0;
7049 }
Victor Stinner74419f02020-07-03 11:35:37 +02007050 tp = state->Pass_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007051 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007052 if (isinstance == -1) {
7053 return 1;
7054 }
7055 if (isinstance) {
7056
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007057 *out = Pass(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007058 if (*out == NULL) goto failed;
7059 return 0;
7060 }
Victor Stinner74419f02020-07-03 11:35:37 +02007061 tp = state->Break_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007062 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007063 if (isinstance == -1) {
7064 return 1;
7065 }
7066 if (isinstance) {
7067
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007068 *out = Break(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007069 if (*out == NULL) goto failed;
7070 return 0;
7071 }
Victor Stinner74419f02020-07-03 11:35:37 +02007072 tp = state->Continue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007073 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007074 if (isinstance == -1) {
7075 return 1;
7076 }
7077 if (isinstance) {
7078
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007079 *out = Continue(lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007080 if (*out == NULL) goto failed;
7081 return 0;
7082 }
7083
7084 PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %R", obj);
7085 failed:
7086 Py_XDECREF(tmp);
7087 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007088}
7089
7090int
Victor Stinner5cf47822020-11-02 22:03:28 +01007091obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena*
7092 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007093{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007094 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007095
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007096 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007097 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007098 int lineno;
7099 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007100 int end_lineno;
7101 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007102
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007103 if (obj == Py_None) {
7104 *out = NULL;
7105 return 0;
7106 }
Victor Stinner74419f02020-07-03 11:35:37 +02007107 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007108 return 1;
7109 }
7110 if (tmp == NULL) {
7111 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
7112 return 1;
7113 }
7114 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007115 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007116 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007117 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007118 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007119 }
Victor Stinner74419f02020-07-03 11:35:37 +02007120 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00007121 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007122 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007123 if (tmp == NULL) {
7124 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
7125 return 1;
7126 }
7127 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007128 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007129 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007130 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007131 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007132 }
Victor Stinner74419f02020-07-03 11:35:37 +02007133 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007134 return 1;
7135 }
7136 if (tmp == NULL || tmp == Py_None) {
7137 Py_CLEAR(tmp);
7138 end_lineno = 0;
7139 }
7140 else {
7141 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007142 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007143 if (res != 0) goto failed;
7144 Py_CLEAR(tmp);
7145 }
Victor Stinner74419f02020-07-03 11:35:37 +02007146 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007147 return 1;
7148 }
7149 if (tmp == NULL || tmp == Py_None) {
7150 Py_CLEAR(tmp);
7151 end_col_offset = 0;
7152 }
7153 else {
7154 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007155 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007156 if (res != 0) goto failed;
7157 Py_CLEAR(tmp);
7158 }
Victor Stinner74419f02020-07-03 11:35:37 +02007159 tp = state->BoolOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007160 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007161 if (isinstance == -1) {
7162 return 1;
7163 }
7164 if (isinstance) {
7165 boolop_ty op;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007166 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007167
Victor Stinner74419f02020-07-03 11:35:37 +02007168 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007169 return 1;
7170 }
7171 if (tmp == NULL) {
7172 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
7173 return 1;
7174 }
7175 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007176 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007177 res = obj2ast_boolop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007178 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007179 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007180 }
Victor Stinner74419f02020-07-03 11:35:37 +02007181 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007182 return 1;
7183 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007184 if (tmp == NULL) {
7185 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
7186 return 1;
7187 }
7188 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007189 int res;
7190 Py_ssize_t len;
7191 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007192 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007193 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 +02007194 goto failed;
7195 }
7196 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007197 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007198 if (values == NULL) goto failed;
7199 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007200 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007201 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7202 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007203 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007204 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007205 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007206 if (len != PyList_GET_SIZE(tmp)) {
7207 PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration");
7208 goto failed;
7209 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007210 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007211 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007212 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007213 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007214 *out = BoolOp(op, values, lineno, col_offset, end_lineno,
7215 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007216 if (*out == NULL) goto failed;
7217 return 0;
7218 }
Victor Stinner74419f02020-07-03 11:35:37 +02007219 tp = state->NamedExpr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007220 isinstance = PyObject_IsInstance(obj, tp);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007221 if (isinstance == -1) {
7222 return 1;
7223 }
7224 if (isinstance) {
7225 expr_ty target;
7226 expr_ty value;
7227
Victor Stinner74419f02020-07-03 11:35:37 +02007228 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007229 return 1;
7230 }
7231 if (tmp == NULL) {
7232 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from NamedExpr");
7233 return 1;
7234 }
7235 else {
7236 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007237 res = obj2ast_expr(state, tmp, &target, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007238 if (res != 0) goto failed;
7239 Py_CLEAR(tmp);
7240 }
Victor Stinner74419f02020-07-03 11:35:37 +02007241 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007242 return 1;
7243 }
7244 if (tmp == NULL) {
7245 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from NamedExpr");
7246 return 1;
7247 }
7248 else {
7249 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007250 res = obj2ast_expr(state, tmp, &value, arena);
Emily Morehouse8f59ee02019-01-24 16:49:56 -07007251 if (res != 0) goto failed;
7252 Py_CLEAR(tmp);
7253 }
7254 *out = NamedExpr(target, value, lineno, col_offset, end_lineno,
7255 end_col_offset, arena);
7256 if (*out == NULL) goto failed;
7257 return 0;
7258 }
Victor Stinner74419f02020-07-03 11:35:37 +02007259 tp = state->BinOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007260 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007261 if (isinstance == -1) {
7262 return 1;
7263 }
7264 if (isinstance) {
7265 expr_ty left;
7266 operator_ty op;
7267 expr_ty right;
7268
Victor Stinner74419f02020-07-03 11:35:37 +02007269 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007270 return 1;
7271 }
7272 if (tmp == NULL) {
7273 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
7274 return 1;
7275 }
7276 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007277 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007278 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007279 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007280 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007281 }
Victor Stinner74419f02020-07-03 11:35:37 +02007282 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007283 return 1;
7284 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007285 if (tmp == NULL) {
7286 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
7287 return 1;
7288 }
7289 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007290 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007291 res = obj2ast_operator(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007292 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007293 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007294 }
Victor Stinner74419f02020-07-03 11:35:37 +02007295 if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007296 return 1;
7297 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007298 if (tmp == NULL) {
7299 PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
7300 return 1;
7301 }
7302 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007303 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007304 res = obj2ast_expr(state, tmp, &right, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007305 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007306 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007307 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007308 *out = BinOp(left, op, right, lineno, col_offset, end_lineno,
7309 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007310 if (*out == NULL) goto failed;
7311 return 0;
7312 }
Victor Stinner74419f02020-07-03 11:35:37 +02007313 tp = state->UnaryOp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007314 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007315 if (isinstance == -1) {
7316 return 1;
7317 }
7318 if (isinstance) {
7319 unaryop_ty op;
7320 expr_ty operand;
7321
Victor Stinner74419f02020-07-03 11:35:37 +02007322 if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007323 return 1;
7324 }
7325 if (tmp == NULL) {
7326 PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
7327 return 1;
7328 }
7329 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007330 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007331 res = obj2ast_unaryop(state, tmp, &op, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007332 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007333 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007334 }
Victor Stinner74419f02020-07-03 11:35:37 +02007335 if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007336 return 1;
7337 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007338 if (tmp == NULL) {
7339 PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
7340 return 1;
7341 }
7342 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007343 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007344 res = obj2ast_expr(state, tmp, &operand, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007345 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007346 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007347 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007348 *out = UnaryOp(op, operand, lineno, col_offset, end_lineno,
7349 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007350 if (*out == NULL) goto failed;
7351 return 0;
7352 }
Victor Stinner74419f02020-07-03 11:35:37 +02007353 tp = state->Lambda_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007354 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007355 if (isinstance == -1) {
7356 return 1;
7357 }
7358 if (isinstance) {
7359 arguments_ty args;
7360 expr_ty body;
7361
Victor Stinner74419f02020-07-03 11:35:37 +02007362 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007363 return 1;
7364 }
7365 if (tmp == NULL) {
7366 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
7367 return 1;
7368 }
7369 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007370 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007371 res = obj2ast_arguments(state, tmp, &args, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007372 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007373 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007374 }
Victor Stinner74419f02020-07-03 11:35:37 +02007375 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007376 return 1;
7377 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007378 if (tmp == NULL) {
7379 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
7380 return 1;
7381 }
7382 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007383 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007384 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007385 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007386 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007387 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007388 *out = Lambda(args, body, lineno, col_offset, end_lineno,
7389 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007390 if (*out == NULL) goto failed;
7391 return 0;
7392 }
Victor Stinner74419f02020-07-03 11:35:37 +02007393 tp = state->IfExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007394 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007395 if (isinstance == -1) {
7396 return 1;
7397 }
7398 if (isinstance) {
7399 expr_ty test;
7400 expr_ty body;
7401 expr_ty orelse;
7402
Victor Stinner74419f02020-07-03 11:35:37 +02007403 if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007404 return 1;
7405 }
7406 if (tmp == NULL) {
7407 PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
7408 return 1;
7409 }
7410 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007411 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007412 res = obj2ast_expr(state, tmp, &test, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007413 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007414 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007415 }
Victor Stinner74419f02020-07-03 11:35:37 +02007416 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007417 return 1;
7418 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007419 if (tmp == NULL) {
7420 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
7421 return 1;
7422 }
7423 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007424 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007425 res = obj2ast_expr(state, tmp, &body, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007426 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007427 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007428 }
Victor Stinner74419f02020-07-03 11:35:37 +02007429 if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007430 return 1;
7431 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007432 if (tmp == NULL) {
7433 PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
7434 return 1;
7435 }
7436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007437 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007438 res = obj2ast_expr(state, tmp, &orelse, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007439 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007440 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007441 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007442 *out = IfExp(test, body, orelse, lineno, col_offset, end_lineno,
7443 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007444 if (*out == NULL) goto failed;
7445 return 0;
7446 }
Victor Stinner74419f02020-07-03 11:35:37 +02007447 tp = state->Dict_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007448 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007449 if (isinstance == -1) {
7450 return 1;
7451 }
7452 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007453 asdl_expr_seq* keys;
7454 asdl_expr_seq* values;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007455
Victor Stinner74419f02020-07-03 11:35:37 +02007456 if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007457 return 1;
7458 }
7459 if (tmp == NULL) {
7460 PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
7461 return 1;
7462 }
7463 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007464 int res;
7465 Py_ssize_t len;
7466 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007467 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007468 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 +02007469 goto failed;
7470 }
7471 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007472 keys = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007473 if (keys == NULL) goto failed;
7474 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007475 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007476 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7477 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007478 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007479 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007480 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007481 if (len != PyList_GET_SIZE(tmp)) {
7482 PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration");
7483 goto failed;
7484 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007485 asdl_seq_SET(keys, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007486 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007487 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007488 }
Victor Stinner74419f02020-07-03 11:35:37 +02007489 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007490 return 1;
7491 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007492 if (tmp == NULL) {
7493 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
7494 return 1;
7495 }
7496 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007497 int res;
7498 Py_ssize_t len;
7499 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007500 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007501 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 +02007502 goto failed;
7503 }
7504 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007505 values = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007506 if (values == NULL) goto failed;
7507 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007508 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007509 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7510 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007511 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007512 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007513 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007514 if (len != PyList_GET_SIZE(tmp)) {
7515 PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration");
7516 goto failed;
7517 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007518 asdl_seq_SET(values, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007519 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007520 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007521 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007522 *out = Dict(keys, values, lineno, col_offset, end_lineno,
7523 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007524 if (*out == NULL) goto failed;
7525 return 0;
7526 }
Victor Stinner74419f02020-07-03 11:35:37 +02007527 tp = state->Set_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007528 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007529 if (isinstance == -1) {
7530 return 1;
7531 }
7532 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01007533 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007534
Victor Stinner74419f02020-07-03 11:35:37 +02007535 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007536 return 1;
7537 }
7538 if (tmp == NULL) {
7539 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
7540 return 1;
7541 }
7542 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007543 int res;
7544 Py_ssize_t len;
7545 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007546 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007547 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 +02007548 goto failed;
7549 }
7550 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007551 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007552 if (elts == NULL) goto failed;
7553 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007554 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007555 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7556 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007557 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007558 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007559 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007560 if (len != PyList_GET_SIZE(tmp)) {
7561 PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration");
7562 goto failed;
7563 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007564 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007565 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007566 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007567 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007568 *out = Set(elts, lineno, col_offset, end_lineno, end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007569 if (*out == NULL) goto failed;
7570 return 0;
7571 }
Victor Stinner74419f02020-07-03 11:35:37 +02007572 tp = state->ListComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007573 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007574 if (isinstance == -1) {
7575 return 1;
7576 }
7577 if (isinstance) {
7578 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007579 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007580
Victor Stinner74419f02020-07-03 11:35:37 +02007581 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007582 return 1;
7583 }
7584 if (tmp == NULL) {
7585 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
7586 return 1;
7587 }
7588 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007589 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007590 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007591 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007592 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007593 }
Victor Stinner74419f02020-07-03 11:35:37 +02007594 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007595 return 1;
7596 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007597 if (tmp == NULL) {
7598 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
7599 return 1;
7600 }
7601 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007602 int res;
7603 Py_ssize_t len;
7604 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007605 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007606 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 +02007607 goto failed;
7608 }
7609 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007610 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007611 if (generators == NULL) goto failed;
7612 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007613 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007614 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7615 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007616 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007617 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007618 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007619 if (len != PyList_GET_SIZE(tmp)) {
7620 PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration");
7621 goto failed;
7622 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007623 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007624 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007625 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007626 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007627 *out = ListComp(elt, generators, lineno, col_offset, end_lineno,
7628 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007629 if (*out == NULL) goto failed;
7630 return 0;
7631 }
Victor Stinner74419f02020-07-03 11:35:37 +02007632 tp = state->SetComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007633 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007634 if (isinstance == -1) {
7635 return 1;
7636 }
7637 if (isinstance) {
7638 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007639 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007640
Victor Stinner74419f02020-07-03 11:35:37 +02007641 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007642 return 1;
7643 }
7644 if (tmp == NULL) {
7645 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
7646 return 1;
7647 }
7648 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007649 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007650 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007651 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007652 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007653 }
Victor Stinner74419f02020-07-03 11:35:37 +02007654 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007655 return 1;
7656 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007657 if (tmp == NULL) {
7658 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
7659 return 1;
7660 }
7661 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007662 int res;
7663 Py_ssize_t len;
7664 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007665 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007666 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 +02007667 goto failed;
7668 }
7669 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007670 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007671 if (generators == NULL) goto failed;
7672 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007673 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007674 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7675 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007676 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007677 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007678 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007679 if (len != PyList_GET_SIZE(tmp)) {
7680 PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration");
7681 goto failed;
7682 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007683 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007684 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007685 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007686 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007687 *out = SetComp(elt, generators, lineno, col_offset, end_lineno,
7688 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007689 if (*out == NULL) goto failed;
7690 return 0;
7691 }
Victor Stinner74419f02020-07-03 11:35:37 +02007692 tp = state->DictComp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007693 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007694 if (isinstance == -1) {
7695 return 1;
7696 }
7697 if (isinstance) {
7698 expr_ty key;
7699 expr_ty value;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007700 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007701
Victor Stinner74419f02020-07-03 11:35:37 +02007702 if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007703 return 1;
7704 }
7705 if (tmp == NULL) {
7706 PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
7707 return 1;
7708 }
7709 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007710 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007711 res = obj2ast_expr(state, tmp, &key, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007712 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007713 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007714 }
Victor Stinner74419f02020-07-03 11:35:37 +02007715 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007716 return 1;
7717 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007718 if (tmp == NULL) {
7719 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
7720 return 1;
7721 }
7722 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007723 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007724 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007725 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007726 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007727 }
Victor Stinner74419f02020-07-03 11:35:37 +02007728 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007729 return 1;
7730 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007731 if (tmp == NULL) {
7732 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
7733 return 1;
7734 }
7735 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007736 int res;
7737 Py_ssize_t len;
7738 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007739 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007740 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 +02007741 goto failed;
7742 }
7743 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007744 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007745 if (generators == NULL) goto failed;
7746 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007747 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007748 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7749 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007750 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007751 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007752 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007753 if (len != PyList_GET_SIZE(tmp)) {
7754 PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration");
7755 goto failed;
7756 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007757 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007758 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007759 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007760 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007761 *out = DictComp(key, value, generators, lineno, col_offset, end_lineno,
7762 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007763 if (*out == NULL) goto failed;
7764 return 0;
7765 }
Victor Stinner74419f02020-07-03 11:35:37 +02007766 tp = state->GeneratorExp_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007767 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007768 if (isinstance == -1) {
7769 return 1;
7770 }
7771 if (isinstance) {
7772 expr_ty elt;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007773 asdl_comprehension_seq* generators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007774
Victor Stinner74419f02020-07-03 11:35:37 +02007775 if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007776 return 1;
7777 }
7778 if (tmp == NULL) {
7779 PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
7780 return 1;
7781 }
7782 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007783 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007784 res = obj2ast_expr(state, tmp, &elt, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007785 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007786 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007787 }
Victor Stinner74419f02020-07-03 11:35:37 +02007788 if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007789 return 1;
7790 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007791 if (tmp == NULL) {
7792 PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
7793 return 1;
7794 }
7795 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007796 int res;
7797 Py_ssize_t len;
7798 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007799 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007800 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 +02007801 goto failed;
7802 }
7803 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007804 generators = _Py_asdl_comprehension_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007805 if (generators == NULL) goto failed;
7806 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007807 comprehension_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007808 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7809 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007810 res = obj2ast_comprehension(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007811 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007812 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007813 if (len != PyList_GET_SIZE(tmp)) {
7814 PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration");
7815 goto failed;
7816 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007817 asdl_seq_SET(generators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007818 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007819 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007820 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007821 *out = GeneratorExp(elt, generators, lineno, col_offset, end_lineno,
7822 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007823 if (*out == NULL) goto failed;
7824 return 0;
7825 }
Victor Stinner74419f02020-07-03 11:35:37 +02007826 tp = state->Await_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007827 isinstance = PyObject_IsInstance(obj, tp);
Yury Selivanov75445082015-05-11 22:57:16 -04007828 if (isinstance == -1) {
7829 return 1;
7830 }
7831 if (isinstance) {
7832 expr_ty value;
7833
Victor Stinner74419f02020-07-03 11:35:37 +02007834 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007835 return 1;
7836 }
7837 if (tmp == NULL) {
7838 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Await");
7839 return 1;
7840 }
7841 else {
Yury Selivanov75445082015-05-11 22:57:16 -04007842 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007843 res = obj2ast_expr(state, tmp, &value, arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007844 if (res != 0) goto failed;
7845 Py_CLEAR(tmp);
Yury Selivanov75445082015-05-11 22:57:16 -04007846 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007847 *out = Await(value, lineno, col_offset, end_lineno, end_col_offset,
7848 arena);
Yury Selivanov75445082015-05-11 22:57:16 -04007849 if (*out == NULL) goto failed;
7850 return 0;
7851 }
Victor Stinner74419f02020-07-03 11:35:37 +02007852 tp = state->Yield_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007853 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007854 if (isinstance == -1) {
7855 return 1;
7856 }
7857 if (isinstance) {
7858 expr_ty value;
7859
Victor Stinner74419f02020-07-03 11:35:37 +02007860 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007861 return 1;
7862 }
7863 if (tmp == NULL || tmp == Py_None) {
7864 Py_CLEAR(tmp);
7865 value = NULL;
7866 }
7867 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007868 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007869 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007870 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007871 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007872 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007873 *out = Yield(value, lineno, col_offset, end_lineno, end_col_offset,
7874 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->YieldFrom_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007879 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007880 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 YieldFrom");
7891 return 1;
7892 }
7893 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007894 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007895 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007896 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007897 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007898 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007899 *out = YieldFrom(value, lineno, col_offset, end_lineno, end_col_offset,
7900 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007901 if (*out == NULL) goto failed;
7902 return 0;
7903 }
Victor Stinner74419f02020-07-03 11:35:37 +02007904 tp = state->Compare_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 left;
7911 asdl_int_seq* ops;
Pablo Galindoa5634c42020-09-16 19:42:00 +01007912 asdl_expr_seq* comparators;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007913
Victor Stinner74419f02020-07-03 11:35:37 +02007914 if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007915 return 1;
7916 }
7917 if (tmp == NULL) {
7918 PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
7919 return 1;
7920 }
7921 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007922 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02007923 res = obj2ast_expr(state, tmp, &left, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007924 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02007925 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007926 }
Victor Stinner74419f02020-07-03 11:35:37 +02007927 if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007928 return 1;
7929 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007930 if (tmp == NULL) {
7931 PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
7932 return 1;
7933 }
7934 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007935 int res;
7936 Py_ssize_t len;
7937 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007938 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007939 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 +02007940 goto failed;
7941 }
7942 len = PyList_GET_SIZE(tmp);
Antoine Pitroud01d396e2013-10-12 22:52:43 +02007943 ops = _Py_asdl_int_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007944 if (ops == NULL) goto failed;
7945 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007946 cmpop_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007947 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7948 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007949 res = obj2ast_cmpop(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007950 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007951 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007952 if (len != PyList_GET_SIZE(tmp)) {
7953 PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration");
7954 goto failed;
7955 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007956 asdl_seq_SET(ops, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007957 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007958 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007959 }
Victor Stinner74419f02020-07-03 11:35:37 +02007960 if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007961 return 1;
7962 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02007963 if (tmp == NULL) {
7964 PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
7965 return 1;
7966 }
7967 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007968 int res;
7969 Py_ssize_t len;
7970 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007971 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07007972 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 +02007973 goto failed;
7974 }
7975 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01007976 comparators = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007977 if (comparators == NULL) goto failed;
7978 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007979 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007980 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
7981 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02007982 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03007983 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007984 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03007985 if (len != PyList_GET_SIZE(tmp)) {
7986 PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration");
7987 goto failed;
7988 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07007989 asdl_seq_SET(comparators, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007990 }
Victor Stinner1acc1292013-07-27 00:03:47 +02007991 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007992 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007993 *out = Compare(left, ops, comparators, lineno, col_offset, end_lineno,
7994 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02007995 if (*out == NULL) goto failed;
7996 return 0;
7997 }
Victor Stinner74419f02020-07-03 11:35:37 +02007998 tp = state->Call_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07007999 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008000 if (isinstance == -1) {
8001 return 1;
8002 }
8003 if (isinstance) {
8004 expr_ty func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008005 asdl_expr_seq* args;
8006 asdl_keyword_seq* keywords;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008007
Victor Stinner74419f02020-07-03 11:35:37 +02008008 if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008009 return 1;
8010 }
8011 if (tmp == NULL) {
8012 PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
8013 return 1;
8014 }
8015 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008016 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008017 res = obj2ast_expr(state, tmp, &func, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008018 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008019 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008020 }
Victor Stinner74419f02020-07-03 11:35:37 +02008021 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008022 return 1;
8023 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008024 if (tmp == NULL) {
8025 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
8026 return 1;
8027 }
8028 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008029 int res;
8030 Py_ssize_t len;
8031 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008032 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008033 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 +02008034 goto failed;
8035 }
8036 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008037 args = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008038 if (args == NULL) goto failed;
8039 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008040 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008041 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8042 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008043 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008044 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008045 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008046 if (len != PyList_GET_SIZE(tmp)) {
8047 PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration");
8048 goto failed;
8049 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008050 asdl_seq_SET(args, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008051 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008052 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008053 }
Victor Stinner74419f02020-07-03 11:35:37 +02008054 if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008055 return 1;
8056 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008057 if (tmp == NULL) {
8058 PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
8059 return 1;
8060 }
8061 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008062 int res;
8063 Py_ssize_t len;
8064 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008065 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008066 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 +02008067 goto failed;
8068 }
8069 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008070 keywords = _Py_asdl_keyword_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008071 if (keywords == NULL) goto failed;
8072 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008073 keyword_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008074 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8075 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008076 res = obj2ast_keyword(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008077 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008078 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008079 if (len != PyList_GET_SIZE(tmp)) {
8080 PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration");
8081 goto failed;
8082 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008083 asdl_seq_SET(keywords, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008084 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008085 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008086 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008087 *out = Call(func, args, keywords, lineno, col_offset, end_lineno,
8088 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008089 if (*out == NULL) goto failed;
8090 return 0;
8091 }
Victor Stinner74419f02020-07-03 11:35:37 +02008092 tp = state->FormattedValue_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008093 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008094 if (isinstance == -1) {
8095 return 1;
8096 }
8097 if (isinstance) {
8098 expr_ty value;
8099 int conversion;
8100 expr_ty format_spec;
8101
Victor Stinner74419f02020-07-03 11:35:37 +02008102 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008103 return 1;
8104 }
8105 if (tmp == NULL) {
8106 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from FormattedValue");
8107 return 1;
8108 }
8109 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008110 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008111 res = obj2ast_expr(state, tmp, &value, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008112 if (res != 0) goto failed;
8113 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008114 }
Victor Stinner74419f02020-07-03 11:35:37 +02008115 if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008116 return 1;
8117 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008118 if (tmp == NULL || tmp == Py_None) {
8119 Py_CLEAR(tmp);
8120 conversion = 0;
8121 }
8122 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008123 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008124 res = obj2ast_int(state, tmp, &conversion, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008125 if (res != 0) goto failed;
8126 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008127 }
Victor Stinner74419f02020-07-03 11:35:37 +02008128 if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008129 return 1;
8130 }
8131 if (tmp == NULL || tmp == Py_None) {
8132 Py_CLEAR(tmp);
8133 format_spec = NULL;
8134 }
8135 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008136 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008137 res = obj2ast_expr(state, tmp, &format_spec, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008138 if (res != 0) goto failed;
8139 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008140 }
Eric V. Smith6f6ff8a2019-05-27 15:31:52 -04008141 *out = FormattedValue(value, conversion, format_spec, lineno,
8142 col_offset, end_lineno, end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008143 if (*out == NULL) goto failed;
8144 return 0;
8145 }
Victor Stinner74419f02020-07-03 11:35:37 +02008146 tp = state->JoinedStr_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008147 isinstance = PyObject_IsInstance(obj, tp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008148 if (isinstance == -1) {
8149 return 1;
8150 }
8151 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008152 asdl_expr_seq* values;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008153
Victor Stinner74419f02020-07-03 11:35:37 +02008154 if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008155 return 1;
8156 }
8157 if (tmp == NULL) {
8158 PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from JoinedStr");
8159 return 1;
8160 }
8161 else {
Eric V. Smith235a6f02015-09-19 14:51:32 -04008162 int res;
8163 Py_ssize_t len;
8164 Py_ssize_t i;
Eric V. Smith235a6f02015-09-19 14:51:32 -04008165 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008166 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 -04008167 goto failed;
8168 }
8169 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008170 values = _Py_asdl_expr_seq_new(len, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008171 if (values == NULL) goto failed;
8172 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008173 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008174 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8175 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008176 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008177 Py_DECREF(tmp2);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008178 if (res != 0) goto failed;
Serhiy Storchaka5e808552016-10-07 21:55:49 +03008179 if (len != PyList_GET_SIZE(tmp)) {
8180 PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration");
8181 goto failed;
8182 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008183 asdl_seq_SET(values, i, val);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008184 }
8185 Py_CLEAR(tmp);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008186 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008187 *out = JoinedStr(values, lineno, col_offset, end_lineno,
8188 end_col_offset, arena);
Eric V. Smith235a6f02015-09-19 14:51:32 -04008189 if (*out == NULL) goto failed;
8190 return 0;
8191 }
Victor Stinner74419f02020-07-03 11:35:37 +02008192 tp = state->Constant_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008193 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008194 if (isinstance == -1) {
8195 return 1;
8196 }
8197 if (isinstance) {
8198 constant value;
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008199 string kind;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008200
Victor Stinner74419f02020-07-03 11:35:37 +02008201 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008202 return 1;
8203 }
8204 if (tmp == NULL) {
8205 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Constant");
8206 return 1;
8207 }
8208 else {
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008209 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008210 res = obj2ast_constant(state, tmp, &value, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008211 if (res != 0) goto failed;
8212 Py_CLEAR(tmp);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008213 }
Victor Stinner74419f02020-07-03 11:35:37 +02008214 if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) {
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008215 return 1;
8216 }
8217 if (tmp == NULL || tmp == Py_None) {
8218 Py_CLEAR(tmp);
8219 kind = NULL;
8220 }
8221 else {
8222 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008223 res = obj2ast_string(state, tmp, &kind, arena);
Guido van Rossum10f8ce62019-03-13 13:00:46 -07008224 if (res != 0) goto failed;
8225 Py_CLEAR(tmp);
8226 }
8227 *out = Constant(value, kind, lineno, col_offset, end_lineno,
8228 end_col_offset, arena);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01008229 if (*out == NULL) goto failed;
8230 return 0;
8231 }
Victor Stinner74419f02020-07-03 11:35:37 +02008232 tp = state->Attribute_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008233 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008234 if (isinstance == -1) {
8235 return 1;
8236 }
8237 if (isinstance) {
8238 expr_ty value;
8239 identifier attr;
8240 expr_context_ty ctx;
8241
Victor Stinner74419f02020-07-03 11:35:37 +02008242 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008243 return 1;
8244 }
8245 if (tmp == NULL) {
8246 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
8247 return 1;
8248 }
8249 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008250 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008251 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008252 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008253 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008254 }
Victor Stinner74419f02020-07-03 11:35:37 +02008255 if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008256 return 1;
8257 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008258 if (tmp == NULL) {
8259 PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
8260 return 1;
8261 }
8262 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008263 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008264 res = obj2ast_identifier(state, tmp, &attr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008265 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008266 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008267 }
Victor Stinner74419f02020-07-03 11:35:37 +02008268 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008269 return 1;
8270 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008271 if (tmp == NULL) {
8272 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
8273 return 1;
8274 }
8275 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008276 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008277 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008278 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008279 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008280 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008281 *out = Attribute(value, attr, ctx, lineno, col_offset, end_lineno,
8282 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008283 if (*out == NULL) goto failed;
8284 return 0;
8285 }
Victor Stinner74419f02020-07-03 11:35:37 +02008286 tp = state->Subscript_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008287 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008288 if (isinstance == -1) {
8289 return 1;
8290 }
8291 if (isinstance) {
8292 expr_ty value;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008293 expr_ty slice;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008294 expr_context_ty ctx;
8295
Victor Stinner74419f02020-07-03 11:35:37 +02008296 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008297 return 1;
8298 }
8299 if (tmp == NULL) {
8300 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
8301 return 1;
8302 }
8303 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008304 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008305 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008306 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008307 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008308 }
Victor Stinner74419f02020-07-03 11:35:37 +02008309 if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008310 return 1;
8311 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008312 if (tmp == NULL) {
8313 PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
8314 return 1;
8315 }
8316 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008317 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008318 res = obj2ast_expr(state, tmp, &slice, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008319 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008320 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008321 }
Victor Stinner74419f02020-07-03 11:35:37 +02008322 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008323 return 1;
8324 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008325 if (tmp == NULL) {
8326 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
8327 return 1;
8328 }
8329 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008330 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008331 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008332 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008333 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008334 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008335 *out = Subscript(value, slice, ctx, lineno, col_offset, end_lineno,
8336 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008337 if (*out == NULL) goto failed;
8338 return 0;
8339 }
Victor Stinner74419f02020-07-03 11:35:37 +02008340 tp = state->Starred_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008341 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008342 if (isinstance == -1) {
8343 return 1;
8344 }
8345 if (isinstance) {
8346 expr_ty value;
8347 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 Starred");
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->ctx, &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 \"ctx\" missing from Starred");
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_context(state, tmp, &ctx, 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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008374 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008375 *out = Starred(value, ctx, lineno, col_offset, end_lineno,
8376 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008377 if (*out == NULL) goto failed;
8378 return 0;
8379 }
Victor Stinner74419f02020-07-03 11:35:37 +02008380 tp = state->Name_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008381 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008382 if (isinstance == -1) {
8383 return 1;
8384 }
8385 if (isinstance) {
8386 identifier id;
8387 expr_context_ty ctx;
8388
Victor Stinner74419f02020-07-03 11:35:37 +02008389 if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008390 return 1;
8391 }
8392 if (tmp == NULL) {
8393 PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
8394 return 1;
8395 }
8396 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008397 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008398 res = obj2ast_identifier(state, tmp, &id, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008399 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008400 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008401 }
Victor Stinner74419f02020-07-03 11:35:37 +02008402 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008403 return 1;
8404 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008405 if (tmp == NULL) {
8406 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
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_context(state, tmp, &ctx, 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);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008414 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008415 *out = Name(id, ctx, lineno, col_offset, end_lineno, end_col_offset,
8416 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008417 if (*out == NULL) goto failed;
8418 return 0;
8419 }
Victor Stinner74419f02020-07-03 11:35:37 +02008420 tp = state->List_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008421 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008422 if (isinstance == -1) {
8423 return 1;
8424 }
8425 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008426 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008427 expr_context_ty ctx;
8428
Victor Stinner74419f02020-07-03 11:35:37 +02008429 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008430 return 1;
8431 }
8432 if (tmp == NULL) {
8433 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
8434 return 1;
8435 }
8436 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008437 int res;
8438 Py_ssize_t len;
8439 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008440 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008441 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 +02008442 goto failed;
8443 }
8444 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008445 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008446 if (elts == NULL) goto failed;
8447 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008448 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008449 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8450 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008451 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008452 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008453 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008454 if (len != PyList_GET_SIZE(tmp)) {
8455 PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration");
8456 goto failed;
8457 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008458 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008459 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008460 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008461 }
Victor Stinner74419f02020-07-03 11:35:37 +02008462 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008463 return 1;
8464 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008465 if (tmp == NULL) {
8466 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
8467 return 1;
8468 }
8469 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008470 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008471 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008472 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008473 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008474 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008475 *out = List(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8476 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008477 if (*out == NULL) goto failed;
8478 return 0;
8479 }
Victor Stinner74419f02020-07-03 11:35:37 +02008480 tp = state->Tuple_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07008481 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008482 if (isinstance == -1) {
8483 return 1;
8484 }
8485 if (isinstance) {
Pablo Galindoa5634c42020-09-16 19:42:00 +01008486 asdl_expr_seq* elts;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008487 expr_context_ty ctx;
8488
Victor Stinner74419f02020-07-03 11:35:37 +02008489 if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008490 return 1;
8491 }
8492 if (tmp == NULL) {
8493 PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
8494 return 1;
8495 }
8496 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008497 int res;
8498 Py_ssize_t len;
8499 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008500 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008501 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 +02008502 goto failed;
8503 }
8504 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008505 elts = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008506 if (elts == NULL) goto failed;
8507 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008508 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008509 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8510 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008511 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008512 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008513 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008514 if (len != PyList_GET_SIZE(tmp)) {
8515 PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration");
8516 goto failed;
8517 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008518 asdl_seq_SET(elts, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008519 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008520 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008521 }
Victor Stinner74419f02020-07-03 11:35:37 +02008522 if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008523 return 1;
8524 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008525 if (tmp == NULL) {
8526 PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
8527 return 1;
8528 }
8529 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008530 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008531 res = obj2ast_expr_context(state, tmp, &ctx, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008532 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008533 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008534 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008535 *out = Tuple(elts, ctx, lineno, col_offset, end_lineno, end_col_offset,
8536 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008537 if (*out == NULL) goto failed;
8538 return 0;
8539 }
Victor Stinner74419f02020-07-03 11:35:37 +02008540 tp = state->Slice_type;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008541 isinstance = PyObject_IsInstance(obj, tp);
8542 if (isinstance == -1) {
8543 return 1;
8544 }
8545 if (isinstance) {
8546 expr_ty lower;
8547 expr_ty upper;
8548 expr_ty step;
8549
Victor Stinner74419f02020-07-03 11:35:37 +02008550 if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008551 return 1;
8552 }
8553 if (tmp == NULL || tmp == Py_None) {
8554 Py_CLEAR(tmp);
8555 lower = NULL;
8556 }
8557 else {
8558 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008559 res = obj2ast_expr(state, tmp, &lower, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008560 if (res != 0) goto failed;
8561 Py_CLEAR(tmp);
8562 }
Victor Stinner74419f02020-07-03 11:35:37 +02008563 if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008564 return 1;
8565 }
8566 if (tmp == NULL || tmp == Py_None) {
8567 Py_CLEAR(tmp);
8568 upper = NULL;
8569 }
8570 else {
8571 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008572 res = obj2ast_expr(state, tmp, &upper, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008573 if (res != 0) goto failed;
8574 Py_CLEAR(tmp);
8575 }
Victor Stinner74419f02020-07-03 11:35:37 +02008576 if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008577 return 1;
8578 }
8579 if (tmp == NULL || tmp == Py_None) {
8580 Py_CLEAR(tmp);
8581 step = NULL;
8582 }
8583 else {
8584 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008585 res = obj2ast_expr(state, tmp, &step, arena);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02008586 if (res != 0) goto failed;
8587 Py_CLEAR(tmp);
8588 }
8589 *out = Slice(lower, upper, step, lineno, col_offset, end_lineno,
8590 end_col_offset, arena);
8591 if (*out == NULL) goto failed;
8592 return 0;
8593 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008594
8595 PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj);
8596 failed:
8597 Py_XDECREF(tmp);
8598 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008599}
8600
8601int
Victor Stinner5cf47822020-11-02 22:03:28 +01008602obj2ast_expr_context(struct ast_state *state, PyObject* obj, expr_context_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02008603 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008604{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008605 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008606
Victor Stinner74419f02020-07-03 11:35:37 +02008607 isinstance = PyObject_IsInstance(obj, state->Load_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008608 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008609 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008610 }
8611 if (isinstance) {
8612 *out = Load;
8613 return 0;
8614 }
Victor Stinner74419f02020-07-03 11:35:37 +02008615 isinstance = PyObject_IsInstance(obj, state->Store_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008616 if (isinstance == -1) {
8617 return 1;
8618 }
8619 if (isinstance) {
8620 *out = Store;
8621 return 0;
8622 }
Victor Stinner74419f02020-07-03 11:35:37 +02008623 isinstance = PyObject_IsInstance(obj, state->Del_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008624 if (isinstance == -1) {
8625 return 1;
8626 }
8627 if (isinstance) {
8628 *out = Del;
8629 return 0;
8630 }
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008631
8632 PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj);
8633 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008634}
8635
8636int
Victor Stinner5cf47822020-11-02 22:03:28 +01008637obj2ast_boolop(struct ast_state *state, PyObject* obj, boolop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02008638 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008639{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008640 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008641
Victor Stinner74419f02020-07-03 11:35:37 +02008642 isinstance = PyObject_IsInstance(obj, state->And_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008643 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008644 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008645 }
8646 if (isinstance) {
8647 *out = And;
8648 return 0;
8649 }
Victor Stinner74419f02020-07-03 11:35:37 +02008650 isinstance = PyObject_IsInstance(obj, state->Or_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008651 if (isinstance == -1) {
8652 return 1;
8653 }
8654 if (isinstance) {
8655 *out = Or;
8656 return 0;
8657 }
8658
8659 PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %R", obj);
8660 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008661}
8662
8663int
Victor Stinner5cf47822020-11-02 22:03:28 +01008664obj2ast_operator(struct ast_state *state, PyObject* obj, operator_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02008665 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008666{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008667 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008668
Victor Stinner74419f02020-07-03 11:35:37 +02008669 isinstance = PyObject_IsInstance(obj, state->Add_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008670 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008671 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008672 }
8673 if (isinstance) {
8674 *out = Add;
8675 return 0;
8676 }
Victor Stinner74419f02020-07-03 11:35:37 +02008677 isinstance = PyObject_IsInstance(obj, state->Sub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008678 if (isinstance == -1) {
8679 return 1;
8680 }
8681 if (isinstance) {
8682 *out = Sub;
8683 return 0;
8684 }
Victor Stinner74419f02020-07-03 11:35:37 +02008685 isinstance = PyObject_IsInstance(obj, state->Mult_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008686 if (isinstance == -1) {
8687 return 1;
8688 }
8689 if (isinstance) {
8690 *out = Mult;
8691 return 0;
8692 }
Victor Stinner74419f02020-07-03 11:35:37 +02008693 isinstance = PyObject_IsInstance(obj, state->MatMult_type);
Benjamin Petersond51374e2014-04-09 23:55:56 -04008694 if (isinstance == -1) {
8695 return 1;
8696 }
8697 if (isinstance) {
8698 *out = MatMult;
8699 return 0;
8700 }
Victor Stinner74419f02020-07-03 11:35:37 +02008701 isinstance = PyObject_IsInstance(obj, state->Div_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008702 if (isinstance == -1) {
8703 return 1;
8704 }
8705 if (isinstance) {
8706 *out = Div;
8707 return 0;
8708 }
Victor Stinner74419f02020-07-03 11:35:37 +02008709 isinstance = PyObject_IsInstance(obj, state->Mod_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008710 if (isinstance == -1) {
8711 return 1;
8712 }
8713 if (isinstance) {
8714 *out = Mod;
8715 return 0;
8716 }
Victor Stinner74419f02020-07-03 11:35:37 +02008717 isinstance = PyObject_IsInstance(obj, state->Pow_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008718 if (isinstance == -1) {
8719 return 1;
8720 }
8721 if (isinstance) {
8722 *out = Pow;
8723 return 0;
8724 }
Victor Stinner74419f02020-07-03 11:35:37 +02008725 isinstance = PyObject_IsInstance(obj, state->LShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008726 if (isinstance == -1) {
8727 return 1;
8728 }
8729 if (isinstance) {
8730 *out = LShift;
8731 return 0;
8732 }
Victor Stinner74419f02020-07-03 11:35:37 +02008733 isinstance = PyObject_IsInstance(obj, state->RShift_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008734 if (isinstance == -1) {
8735 return 1;
8736 }
8737 if (isinstance) {
8738 *out = RShift;
8739 return 0;
8740 }
Victor Stinner74419f02020-07-03 11:35:37 +02008741 isinstance = PyObject_IsInstance(obj, state->BitOr_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008742 if (isinstance == -1) {
8743 return 1;
8744 }
8745 if (isinstance) {
8746 *out = BitOr;
8747 return 0;
8748 }
Victor Stinner74419f02020-07-03 11:35:37 +02008749 isinstance = PyObject_IsInstance(obj, state->BitXor_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008750 if (isinstance == -1) {
8751 return 1;
8752 }
8753 if (isinstance) {
8754 *out = BitXor;
8755 return 0;
8756 }
Victor Stinner74419f02020-07-03 11:35:37 +02008757 isinstance = PyObject_IsInstance(obj, state->BitAnd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008758 if (isinstance == -1) {
8759 return 1;
8760 }
8761 if (isinstance) {
8762 *out = BitAnd;
8763 return 0;
8764 }
Victor Stinner74419f02020-07-03 11:35:37 +02008765 isinstance = PyObject_IsInstance(obj, state->FloorDiv_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008766 if (isinstance == -1) {
8767 return 1;
8768 }
8769 if (isinstance) {
8770 *out = FloorDiv;
8771 return 0;
8772 }
8773
8774 PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %R", obj);
8775 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008776}
8777
8778int
Victor Stinner5cf47822020-11-02 22:03:28 +01008779obj2ast_unaryop(struct ast_state *state, PyObject* obj, unaryop_ty* out,
8780 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008781{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008782 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008783
Victor Stinner74419f02020-07-03 11:35:37 +02008784 isinstance = PyObject_IsInstance(obj, state->Invert_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008785 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008786 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008787 }
8788 if (isinstance) {
8789 *out = Invert;
8790 return 0;
8791 }
Victor Stinner74419f02020-07-03 11:35:37 +02008792 isinstance = PyObject_IsInstance(obj, state->Not_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008793 if (isinstance == -1) {
8794 return 1;
8795 }
8796 if (isinstance) {
8797 *out = Not;
8798 return 0;
8799 }
Victor Stinner74419f02020-07-03 11:35:37 +02008800 isinstance = PyObject_IsInstance(obj, state->UAdd_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008801 if (isinstance == -1) {
8802 return 1;
8803 }
8804 if (isinstance) {
8805 *out = UAdd;
8806 return 0;
8807 }
Victor Stinner74419f02020-07-03 11:35:37 +02008808 isinstance = PyObject_IsInstance(obj, state->USub_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008809 if (isinstance == -1) {
8810 return 1;
8811 }
8812 if (isinstance) {
8813 *out = USub;
8814 return 0;
8815 }
8816
8817 PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %R", obj);
8818 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008819}
8820
8821int
Victor Stinner5cf47822020-11-02 22:03:28 +01008822obj2ast_cmpop(struct ast_state *state, PyObject* obj, cmpop_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02008823 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008824{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008825 int isinstance;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008826
Victor Stinner74419f02020-07-03 11:35:37 +02008827 isinstance = PyObject_IsInstance(obj, state->Eq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008828 if (isinstance == -1) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008829 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008830 }
8831 if (isinstance) {
8832 *out = Eq;
8833 return 0;
8834 }
Victor Stinner74419f02020-07-03 11:35:37 +02008835 isinstance = PyObject_IsInstance(obj, state->NotEq_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008836 if (isinstance == -1) {
8837 return 1;
8838 }
8839 if (isinstance) {
8840 *out = NotEq;
8841 return 0;
8842 }
Victor Stinner74419f02020-07-03 11:35:37 +02008843 isinstance = PyObject_IsInstance(obj, state->Lt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008844 if (isinstance == -1) {
8845 return 1;
8846 }
8847 if (isinstance) {
8848 *out = Lt;
8849 return 0;
8850 }
Victor Stinner74419f02020-07-03 11:35:37 +02008851 isinstance = PyObject_IsInstance(obj, state->LtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008852 if (isinstance == -1) {
8853 return 1;
8854 }
8855 if (isinstance) {
8856 *out = LtE;
8857 return 0;
8858 }
Victor Stinner74419f02020-07-03 11:35:37 +02008859 isinstance = PyObject_IsInstance(obj, state->Gt_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008860 if (isinstance == -1) {
8861 return 1;
8862 }
8863 if (isinstance) {
8864 *out = Gt;
8865 return 0;
8866 }
Victor Stinner74419f02020-07-03 11:35:37 +02008867 isinstance = PyObject_IsInstance(obj, state->GtE_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008868 if (isinstance == -1) {
8869 return 1;
8870 }
8871 if (isinstance) {
8872 *out = GtE;
8873 return 0;
8874 }
Victor Stinner74419f02020-07-03 11:35:37 +02008875 isinstance = PyObject_IsInstance(obj, state->Is_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008876 if (isinstance == -1) {
8877 return 1;
8878 }
8879 if (isinstance) {
8880 *out = Is;
8881 return 0;
8882 }
Victor Stinner74419f02020-07-03 11:35:37 +02008883 isinstance = PyObject_IsInstance(obj, state->IsNot_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008884 if (isinstance == -1) {
8885 return 1;
8886 }
8887 if (isinstance) {
8888 *out = IsNot;
8889 return 0;
8890 }
Victor Stinner74419f02020-07-03 11:35:37 +02008891 isinstance = PyObject_IsInstance(obj, state->In_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008892 if (isinstance == -1) {
8893 return 1;
8894 }
8895 if (isinstance) {
8896 *out = In;
8897 return 0;
8898 }
Victor Stinner74419f02020-07-03 11:35:37 +02008899 isinstance = PyObject_IsInstance(obj, state->NotIn_type);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008900 if (isinstance == -1) {
8901 return 1;
8902 }
8903 if (isinstance) {
8904 *out = NotIn;
8905 return 0;
8906 }
8907
8908 PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %R", obj);
8909 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008910}
8911
8912int
Victor Stinner5cf47822020-11-02 22:03:28 +01008913obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02008914 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008915{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008916 PyObject* tmp = NULL;
8917 expr_ty target;
8918 expr_ty iter;
Pablo Galindoa5634c42020-09-16 19:42:00 +01008919 asdl_expr_seq* ifs;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008920 int is_async;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008921
Victor Stinner74419f02020-07-03 11:35:37 +02008922 if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008923 return 1;
8924 }
8925 if (tmp == NULL) {
8926 PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
8927 return 1;
8928 }
8929 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008930 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008931 res = obj2ast_expr(state, tmp, &target, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008932 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008933 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008934 }
Victor Stinner74419f02020-07-03 11:35:37 +02008935 if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008936 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008937 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008938 if (tmp == NULL) {
8939 PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
8940 return 1;
8941 }
8942 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008943 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008944 res = obj2ast_expr(state, tmp, &iter, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008945 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02008946 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008947 }
Victor Stinner74419f02020-07-03 11:35:37 +02008948 if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008949 return 1;
8950 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008951 if (tmp == NULL) {
8952 PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
8953 return 1;
8954 }
8955 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008956 int res;
8957 Py_ssize_t len;
8958 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008959 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07008960 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 +02008961 goto failed;
8962 }
8963 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01008964 ifs = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008965 if (ifs == NULL) goto failed;
8966 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008967 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008968 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
8969 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02008970 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03008971 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008972 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03008973 if (len != PyList_GET_SIZE(tmp)) {
8974 PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration");
8975 goto failed;
8976 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07008977 asdl_seq_SET(ifs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008978 }
Victor Stinner1acc1292013-07-27 00:03:47 +02008979 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008980 }
Victor Stinner74419f02020-07-03 11:35:37 +02008981 if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008982 return 1;
8983 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02008984 if (tmp == NULL) {
8985 PyErr_SetString(PyExc_TypeError, "required field \"is_async\" missing from comprehension");
8986 return 1;
8987 }
8988 else {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008989 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02008990 res = obj2ast_int(state, tmp, &is_async, arena);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008991 if (res != 0) goto failed;
8992 Py_CLEAR(tmp);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07008993 }
8994 *out = comprehension(target, iter, ifs, is_async, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02008995 return 0;
8996failed:
8997 Py_XDECREF(tmp);
8998 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00008999}
9000
9001int
Victor Stinner5cf47822020-11-02 22:03:28 +01009002obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty*
Victor Stinner74419f02020-07-03 11:35:37 +02009003 out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009004{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009005 int isinstance;
Neal Norwitzad74aa82008-03-31 05:14:30 +00009006
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009007 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009008 PyObject *tp;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009009 int lineno;
9010 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009011 int end_lineno;
9012 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009013
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009014 if (obj == Py_None) {
9015 *out = NULL;
9016 return 0;
9017 }
Victor Stinner74419f02020-07-03 11:35:37 +02009018 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009019 return 1;
9020 }
9021 if (tmp == NULL) {
9022 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
9023 return 1;
9024 }
9025 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009026 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009027 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009028 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009029 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009030 }
Victor Stinner74419f02020-07-03 11:35:37 +02009031 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009032 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009033 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009034 if (tmp == NULL) {
9035 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
9036 return 1;
9037 }
9038 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009039 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009040 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009041 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009042 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009043 }
Victor Stinner74419f02020-07-03 11:35:37 +02009044 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009045 return 1;
9046 }
9047 if (tmp == NULL || tmp == Py_None) {
9048 Py_CLEAR(tmp);
9049 end_lineno = 0;
9050 }
9051 else {
9052 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009053 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009054 if (res != 0) goto failed;
9055 Py_CLEAR(tmp);
9056 }
Victor Stinner74419f02020-07-03 11:35:37 +02009057 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009058 return 1;
9059 }
9060 if (tmp == NULL || tmp == Py_None) {
9061 Py_CLEAR(tmp);
9062 end_col_offset = 0;
9063 }
9064 else {
9065 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009066 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009067 if (res != 0) goto failed;
9068 Py_CLEAR(tmp);
9069 }
Victor Stinner74419f02020-07-03 11:35:37 +02009070 tp = state->ExceptHandler_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009071 isinstance = PyObject_IsInstance(obj, tp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009072 if (isinstance == -1) {
9073 return 1;
9074 }
9075 if (isinstance) {
9076 expr_ty type;
9077 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009078 asdl_stmt_seq* body;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009079
Victor Stinner74419f02020-07-03 11:35:37 +02009080 if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009081 return 1;
9082 }
9083 if (tmp == NULL || tmp == Py_None) {
9084 Py_CLEAR(tmp);
9085 type = NULL;
9086 }
9087 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009088 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009089 res = obj2ast_expr(state, tmp, &type, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009090 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009091 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009092 }
Victor Stinner74419f02020-07-03 11:35:37 +02009093 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009094 return 1;
9095 }
9096 if (tmp == NULL || tmp == Py_None) {
9097 Py_CLEAR(tmp);
9098 name = NULL;
9099 }
9100 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009101 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009102 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009103 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009104 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009105 }
Victor Stinner74419f02020-07-03 11:35:37 +02009106 if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009107 return 1;
9108 }
9109 if (tmp == NULL) {
9110 PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
9111 return 1;
9112 }
9113 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009114 int res;
9115 Py_ssize_t len;
9116 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009117 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009118 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 +02009119 goto failed;
9120 }
9121 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009122 body = _Py_asdl_stmt_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009123 if (body == NULL) goto failed;
9124 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009125 stmt_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009126 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9127 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009128 res = obj2ast_stmt(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009129 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009130 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009131 if (len != PyList_GET_SIZE(tmp)) {
9132 PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration");
9133 goto failed;
9134 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009135 asdl_seq_SET(body, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009136 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009137 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009138 }
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009139 *out = ExceptHandler(type, name, body, lineno, col_offset, end_lineno,
9140 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009141 if (*out == NULL) goto failed;
9142 return 0;
9143 }
9144
9145 PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %R", obj);
9146 failed:
9147 Py_XDECREF(tmp);
9148 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009149}
9150
9151int
Victor Stinner5cf47822020-11-02 22:03:28 +01009152obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009153 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009154{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009155 PyObject* tmp = NULL;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009156 asdl_arg_seq* posonlyargs;
9157 asdl_arg_seq* args;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009158 arg_ty vararg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009159 asdl_arg_seq* kwonlyargs;
9160 asdl_expr_seq* kw_defaults;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009161 arg_ty kwarg;
Pablo Galindoa5634c42020-09-16 19:42:00 +01009162 asdl_expr_seq* defaults;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009163
Victor Stinner74419f02020-07-03 11:35:37 +02009164 if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) {
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009165 return 1;
9166 }
9167 if (tmp == NULL) {
9168 PyErr_SetString(PyExc_TypeError, "required field \"posonlyargs\" missing from arguments");
9169 return 1;
9170 }
9171 else {
9172 int res;
9173 Py_ssize_t len;
9174 Py_ssize_t i;
9175 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009176 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 +01009177 goto failed;
9178 }
9179 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009180 posonlyargs = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009181 if (posonlyargs == NULL) goto failed;
9182 for (i = 0; i < len; i++) {
9183 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009184 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9185 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009186 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009187 Py_DECREF(tmp2);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009188 if (res != 0) goto failed;
9189 if (len != PyList_GET_SIZE(tmp)) {
9190 PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration");
9191 goto failed;
9192 }
9193 asdl_seq_SET(posonlyargs, i, val);
9194 }
9195 Py_CLEAR(tmp);
9196 }
Victor Stinner74419f02020-07-03 11:35:37 +02009197 if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) {
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009198 return 1;
9199 }
9200 if (tmp == NULL) {
9201 PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
9202 return 1;
9203 }
9204 else {
9205 int res;
9206 Py_ssize_t len;
9207 Py_ssize_t i;
9208 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009209 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 +02009210 goto failed;
9211 }
9212 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009213 args = _Py_asdl_arg_seq_new(len, arena);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009214 if (args == NULL) goto failed;
9215 for (i = 0; i < len; i++) {
9216 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009217 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9218 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009219 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009220 Py_DECREF(tmp2);
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009221 if (res != 0) goto failed;
9222 if (len != PyList_GET_SIZE(tmp)) {
9223 PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration");
9224 goto failed;
9225 }
9226 asdl_seq_SET(args, i, val);
9227 }
9228 Py_CLEAR(tmp);
9229 }
Victor Stinner74419f02020-07-03 11:35:37 +02009230 if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009231 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009232 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009233 if (tmp == NULL || tmp == Py_None) {
9234 Py_CLEAR(tmp);
9235 vararg = NULL;
9236 }
9237 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009238 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009239 res = obj2ast_arg(state, tmp, &vararg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009240 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009241 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009242 }
Victor Stinner74419f02020-07-03 11:35:37 +02009243 if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009244 return 1;
9245 }
9246 if (tmp == NULL) {
9247 PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
9248 return 1;
9249 }
9250 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009251 int res;
9252 Py_ssize_t len;
9253 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009254 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009255 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 +02009256 goto failed;
9257 }
9258 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009259 kwonlyargs = _Py_asdl_arg_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009260 if (kwonlyargs == NULL) goto failed;
9261 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009262 arg_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009263 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9264 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009265 res = obj2ast_arg(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009266 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009267 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009268 if (len != PyList_GET_SIZE(tmp)) {
9269 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration");
9270 goto failed;
9271 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009272 asdl_seq_SET(kwonlyargs, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009273 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009274 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009275 }
Victor Stinner74419f02020-07-03 11:35:37 +02009276 if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009277 return 1;
9278 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009279 if (tmp == NULL) {
9280 PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
9281 return 1;
9282 }
9283 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009284 int res;
9285 Py_ssize_t len;
9286 Py_ssize_t i;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009287 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009288 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 +02009289 goto failed;
9290 }
9291 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009292 kw_defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009293 if (kw_defaults == NULL) goto failed;
9294 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009295 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009296 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9297 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009298 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009299 Py_DECREF(tmp2);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009300 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009301 if (len != PyList_GET_SIZE(tmp)) {
9302 PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration");
9303 goto failed;
9304 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009305 asdl_seq_SET(kw_defaults, i, val);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009306 }
Victor Stinner1acc1292013-07-27 00:03:47 +02009307 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009308 }
Victor Stinner74419f02020-07-03 11:35:37 +02009309 if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009310 return 1;
9311 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009312 if (tmp == NULL || tmp == Py_None) {
9313 Py_CLEAR(tmp);
9314 kwarg = NULL;
9315 }
9316 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009317 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009318 res = obj2ast_arg(state, tmp, &kwarg, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009319 if (res != 0) goto failed;
Victor Stinnerb3189902013-07-27 00:04:42 +02009320 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009321 }
Victor Stinner74419f02020-07-03 11:35:37 +02009322 if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009323 return 1;
9324 }
9325 if (tmp == NULL) {
9326 PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
9327 return 1;
9328 }
9329 else {
Victor Stinneree4b59c2013-07-27 00:01:35 +02009330 int res;
9331 Py_ssize_t len;
9332 Py_ssize_t i;
Victor Stinneree4b59c2013-07-27 00:01:35 +02009333 if (!PyList_Check(tmp)) {
Dino Viehlandac46eb42019-09-11 10:16:34 -07009334 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 +02009335 goto failed;
9336 }
9337 len = PyList_GET_SIZE(tmp);
Pablo Galindoa5634c42020-09-16 19:42:00 +01009338 defaults = _Py_asdl_expr_seq_new(len, arena);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009339 if (defaults == NULL) goto failed;
9340 for (i = 0; i < len; i++) {
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009341 expr_ty val;
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009342 PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
9343 Py_INCREF(tmp2);
Victor Stinner74419f02020-07-03 11:35:37 +02009344 res = obj2ast_expr(state, tmp2, &val, arena);
Serhiy Storchaka43c97312019-09-10 13:02:30 +03009345 Py_DECREF(tmp2);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009346 if (res != 0) goto failed;
Serhiy Storchakacf380602016-10-07 21:51:28 +03009347 if (len != PyList_GET_SIZE(tmp)) {
9348 PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration");
9349 goto failed;
9350 }
Yuan Chao Chou2af565b2017-08-04 10:53:12 -07009351 asdl_seq_SET(defaults, i, val);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009352 }
Victor Stinnerb3189902013-07-27 00:04:42 +02009353 Py_CLEAR(tmp);
Victor Stinneree4b59c2013-07-27 00:01:35 +02009354 }
Pablo Galindocd6e83b2019-07-15 01:32:18 +02009355 *out = arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg,
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01009356 defaults, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009357 return 0;
9358failed:
9359 Py_XDECREF(tmp);
9360 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009361}
9362
9363int
Victor Stinner5cf47822020-11-02 22:03:28 +01009364obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009365{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009366 PyObject* tmp = NULL;
9367 identifier arg;
9368 expr_ty annotation;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009369 string type_comment;
Victor Stinnerc106c682015-11-06 17:01:48 +01009370 int lineno;
9371 int col_offset;
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009372 int end_lineno;
9373 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009374
Victor Stinner74419f02020-07-03 11:35:37 +02009375 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009376 return 1;
9377 }
9378 if (tmp == NULL) {
9379 PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
9380 return 1;
9381 }
9382 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009383 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009384 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009385 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009386 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009387 }
Victor Stinner74419f02020-07-03 11:35:37 +02009388 if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009389 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009390 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009391 if (tmp == NULL || tmp == Py_None) {
9392 Py_CLEAR(tmp);
9393 annotation = NULL;
9394 }
9395 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009396 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009397 res = obj2ast_expr(state, tmp, &annotation, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009398 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009399 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009400 }
Victor Stinner74419f02020-07-03 11:35:37 +02009401 if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009402 return 1;
9403 }
9404 if (tmp == NULL || tmp == Py_None) {
9405 Py_CLEAR(tmp);
9406 type_comment = NULL;
9407 }
9408 else {
9409 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009410 res = obj2ast_string(state, tmp, &type_comment, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009411 if (res != 0) goto failed;
9412 Py_CLEAR(tmp);
9413 }
Victor Stinner74419f02020-07-03 11:35:37 +02009414 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009415 return 1;
9416 }
9417 if (tmp == NULL) {
9418 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
9419 return 1;
9420 }
9421 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009422 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009423 res = obj2ast_int(state, tmp, &lineno, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009424 if (res != 0) goto failed;
9425 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009426 }
Victor Stinner74419f02020-07-03 11:35:37 +02009427 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Victor Stinnerc106c682015-11-06 17:01:48 +01009428 return 1;
9429 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009430 if (tmp == NULL) {
9431 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
9432 return 1;
9433 }
9434 else {
Victor Stinnerc106c682015-11-06 17:01:48 +01009435 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009436 res = obj2ast_int(state, tmp, &col_offset, arena);
Victor Stinnerc106c682015-11-06 17:01:48 +01009437 if (res != 0) goto failed;
9438 Py_CLEAR(tmp);
Victor Stinnerc106c682015-11-06 17:01:48 +01009439 }
Victor Stinner74419f02020-07-03 11:35:37 +02009440 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009441 return 1;
9442 }
9443 if (tmp == NULL || tmp == Py_None) {
9444 Py_CLEAR(tmp);
9445 end_lineno = 0;
9446 }
9447 else {
9448 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009449 res = obj2ast_int(state, tmp, &end_lineno, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009450 if (res != 0) goto failed;
9451 Py_CLEAR(tmp);
9452 }
Victor Stinner74419f02020-07-03 11:35:37 +02009453 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009454 return 1;
9455 }
9456 if (tmp == NULL || tmp == Py_None) {
9457 Py_CLEAR(tmp);
9458 end_col_offset = 0;
9459 }
9460 else {
9461 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009462 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00009463 if (res != 0) goto failed;
9464 Py_CLEAR(tmp);
9465 }
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009466 *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno,
9467 end_col_offset, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009468 return 0;
9469failed:
9470 Py_XDECREF(tmp);
9471 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009472}
9473
9474int
Victor Stinner5cf47822020-11-02 22:03:28 +01009475obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out,
9476 PyArena* arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009477{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009478 PyObject* tmp = NULL;
9479 identifier arg;
9480 expr_ty value;
Pablo Galindo168660b2020-04-02 00:47:39 +01009481 int lineno;
9482 int col_offset;
9483 int end_lineno;
9484 int end_col_offset;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009485
Victor Stinner74419f02020-07-03 11:35:37 +02009486 if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009487 return 1;
9488 }
9489 if (tmp == NULL || tmp == Py_None) {
9490 Py_CLEAR(tmp);
9491 arg = NULL;
9492 }
9493 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009494 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009495 res = obj2ast_identifier(state, tmp, &arg, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009496 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009497 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009498 }
Victor Stinner74419f02020-07-03 11:35:37 +02009499 if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009500 return 1;
9501 }
9502 if (tmp == NULL) {
9503 PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
9504 return 1;
9505 }
9506 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009507 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009508 res = obj2ast_expr(state, tmp, &value, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009509 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009510 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009511 }
Victor Stinner74419f02020-07-03 11:35:37 +02009512 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009513 return 1;
9514 }
9515 if (tmp == NULL) {
9516 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword");
9517 return 1;
9518 }
9519 else {
9520 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009521 res = obj2ast_int(state, tmp, &lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009522 if (res != 0) goto failed;
9523 Py_CLEAR(tmp);
9524 }
Victor Stinner74419f02020-07-03 11:35:37 +02009525 if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009526 return 1;
9527 }
9528 if (tmp == NULL) {
9529 PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword");
9530 return 1;
9531 }
9532 else {
9533 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009534 res = obj2ast_int(state, tmp, &col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009535 if (res != 0) goto failed;
9536 Py_CLEAR(tmp);
9537 }
Victor Stinner74419f02020-07-03 11:35:37 +02009538 if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009539 return 1;
9540 }
9541 if (tmp == NULL || tmp == Py_None) {
9542 Py_CLEAR(tmp);
9543 end_lineno = 0;
9544 }
9545 else {
9546 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009547 res = obj2ast_int(state, tmp, &end_lineno, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009548 if (res != 0) goto failed;
9549 Py_CLEAR(tmp);
9550 }
Victor Stinner74419f02020-07-03 11:35:37 +02009551 if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
Pablo Galindo168660b2020-04-02 00:47:39 +01009552 return 1;
9553 }
9554 if (tmp == NULL || tmp == Py_None) {
9555 Py_CLEAR(tmp);
9556 end_col_offset = 0;
9557 }
9558 else {
9559 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009560 res = obj2ast_int(state, tmp, &end_col_offset, arena);
Pablo Galindo168660b2020-04-02 00:47:39 +01009561 if (res != 0) goto failed;
9562 Py_CLEAR(tmp);
9563 }
9564 *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset,
9565 arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009566 return 0;
9567failed:
9568 Py_XDECREF(tmp);
9569 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009570}
9571
9572int
Victor Stinner5cf47822020-11-02 22:03:28 +01009573obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena*
Victor Stinner74419f02020-07-03 11:35:37 +02009574 arena)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009575{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009576 PyObject* tmp = NULL;
9577 identifier name;
9578 identifier asname;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009579
Victor Stinner74419f02020-07-03 11:35:37 +02009580 if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009581 return 1;
9582 }
9583 if (tmp == NULL) {
9584 PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
9585 return 1;
9586 }
9587 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009588 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009589 res = obj2ast_identifier(state, tmp, &name, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009590 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009591 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009592 }
Victor Stinner74419f02020-07-03 11:35:37 +02009593 if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) {
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009594 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009595 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009596 if (tmp == NULL || tmp == Py_None) {
9597 Py_CLEAR(tmp);
9598 asname = NULL;
9599 }
9600 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009601 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009602 res = obj2ast_identifier(state, tmp, &asname, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009603 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009604 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009605 }
9606 *out = alias(name, asname, arena);
9607 return 0;
9608failed:
9609 Py_XDECREF(tmp);
9610 return 1;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009611}
9612
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009613int
Victor Stinner5cf47822020-11-02 22:03:28 +01009614obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out,
Victor Stinner74419f02020-07-03 11:35:37 +02009615 PyArena* arena)
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009616{
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009617 PyObject* tmp = NULL;
9618 expr_ty context_expr;
9619 expr_ty optional_vars;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009620
Victor Stinner74419f02020-07-03 11:35:37 +02009621 if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009622 return 1;
9623 }
9624 if (tmp == NULL) {
9625 PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
9626 return 1;
9627 }
9628 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009629 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009630 res = obj2ast_expr(state, tmp, &context_expr, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009631 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009632 Py_CLEAR(tmp);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009633 }
Victor Stinner74419f02020-07-03 11:35:37 +02009634 if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) {
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009635 return 1;
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009636 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02009637 if (tmp == NULL || tmp == Py_None) {
9638 Py_CLEAR(tmp);
9639 optional_vars = NULL;
9640 }
9641 else {
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009642 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009643 res = obj2ast_expr(state, tmp, &optional_vars, arena);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009644 if (res != 0) goto failed;
Victor Stinner1acc1292013-07-27 00:03:47 +02009645 Py_CLEAR(tmp);
Victor Stinnerce72e1c2013-07-27 00:00:36 +02009646 }
9647 *out = withitem(context_expr, optional_vars, arena);
9648 return 0;
9649failed:
9650 Py_XDECREF(tmp);
9651 return 1;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05009652}
9653
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009654int
Victor Stinner5cf47822020-11-02 22:03:28 +01009655obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty*
9656 out, PyArena* arena)
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009657{
9658 int isinstance;
9659
9660 PyObject *tmp = NULL;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009661 PyObject *tp;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009662
9663 if (obj == Py_None) {
9664 *out = NULL;
9665 return 0;
9666 }
Victor Stinner74419f02020-07-03 11:35:37 +02009667 tp = state->TypeIgnore_type;
Dino Viehlandac46eb42019-09-11 10:16:34 -07009668 isinstance = PyObject_IsInstance(obj, tp);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009669 if (isinstance == -1) {
9670 return 1;
9671 }
9672 if (isinstance) {
9673 int lineno;
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009674 string tag;
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009675
Victor Stinner74419f02020-07-03 11:35:37 +02009676 if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) {
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009677 return 1;
9678 }
9679 if (tmp == NULL) {
9680 PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore");
9681 return 1;
9682 }
9683 else {
9684 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009685 res = obj2ast_int(state, tmp, &lineno, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009686 if (res != 0) goto failed;
9687 Py_CLEAR(tmp);
9688 }
Victor Stinner74419f02020-07-03 11:35:37 +02009689 if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) {
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009690 return 1;
9691 }
9692 if (tmp == NULL) {
9693 PyErr_SetString(PyExc_TypeError, "required field \"tag\" missing from TypeIgnore");
9694 return 1;
9695 }
9696 else {
9697 int res;
Victor Stinner74419f02020-07-03 11:35:37 +02009698 res = obj2ast_string(state, tmp, &tag, arena);
Michael J. Sullivan933e1502019-05-22 07:54:20 -07009699 if (res != 0) goto failed;
9700 Py_CLEAR(tmp);
9701 }
9702 *out = TypeIgnore(lineno, tag, arena);
Guido van Rossumdcfcd142019-01-31 03:40:27 -08009703 if (*out == NULL) goto failed;
9704 return 0;
9705 }
9706
9707 PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj);
9708 failed:
9709 Py_XDECREF(tmp);
9710 return 1;
9711}
9712
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00009713
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009714static int
9715astmodule_exec(PyObject *m)
Martin v. Löwis577b5b92006-02-27 15:23:19 +00009716{
Victor Stinner5cf47822020-11-02 22:03:28 +01009717 struct ast_state *state = get_ast_state();
9718 if (state == NULL) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009719 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +02009720 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009721 if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009722 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009723 }
Brandt Bucherd2f96672020-02-06 06:45:46 -08009724 if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009725 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009726 }
9727 if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009728 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009729 }
9730 if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009731 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009732 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009733 if (PyModule_AddObjectRef(m, "mod", state->mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009734 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009735 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009736 if (PyModule_AddObjectRef(m, "Module", state->Module_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009737 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009738 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009739 if (PyModule_AddObjectRef(m, "Interactive", state->Interactive_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009740 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009741 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009742 if (PyModule_AddObjectRef(m, "Expression", state->Expression_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009743 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009744 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009745 if (PyModule_AddObjectRef(m, "FunctionType", state->FunctionType_type) < 0)
9746 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009747 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009748 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009749 if (PyModule_AddObjectRef(m, "stmt", state->stmt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009750 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009751 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009752 if (PyModule_AddObjectRef(m, "FunctionDef", state->FunctionDef_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009753 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009754 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009755 if (PyModule_AddObjectRef(m, "AsyncFunctionDef",
9756 state->AsyncFunctionDef_type) < 0) {
9757 return -1;
9758 }
9759 if (PyModule_AddObjectRef(m, "ClassDef", state->ClassDef_type) < 0) {
9760 return -1;
9761 }
9762 if (PyModule_AddObjectRef(m, "Return", state->Return_type) < 0) {
9763 return -1;
9764 }
9765 if (PyModule_AddObjectRef(m, "Delete", state->Delete_type) < 0) {
9766 return -1;
9767 }
9768 if (PyModule_AddObjectRef(m, "Assign", state->Assign_type) < 0) {
9769 return -1;
9770 }
9771 if (PyModule_AddObjectRef(m, "AugAssign", state->AugAssign_type) < 0) {
9772 return -1;
9773 }
9774 if (PyModule_AddObjectRef(m, "AnnAssign", state->AnnAssign_type) < 0) {
9775 return -1;
9776 }
9777 if (PyModule_AddObjectRef(m, "For", state->For_type) < 0) {
9778 return -1;
9779 }
9780 if (PyModule_AddObjectRef(m, "AsyncFor", state->AsyncFor_type) < 0) {
9781 return -1;
9782 }
9783 if (PyModule_AddObjectRef(m, "While", state->While_type) < 0) {
9784 return -1;
9785 }
9786 if (PyModule_AddObjectRef(m, "If", state->If_type) < 0) {
9787 return -1;
9788 }
9789 if (PyModule_AddObjectRef(m, "With", state->With_type) < 0) {
9790 return -1;
9791 }
9792 if (PyModule_AddObjectRef(m, "AsyncWith", state->AsyncWith_type) < 0) {
9793 return -1;
9794 }
9795 if (PyModule_AddObjectRef(m, "Raise", state->Raise_type) < 0) {
9796 return -1;
9797 }
9798 if (PyModule_AddObjectRef(m, "Try", state->Try_type) < 0) {
9799 return -1;
9800 }
9801 if (PyModule_AddObjectRef(m, "Assert", state->Assert_type) < 0) {
9802 return -1;
9803 }
9804 if (PyModule_AddObjectRef(m, "Import", state->Import_type) < 0) {
9805 return -1;
9806 }
9807 if (PyModule_AddObjectRef(m, "ImportFrom", state->ImportFrom_type) < 0) {
9808 return -1;
9809 }
9810 if (PyModule_AddObjectRef(m, "Global", state->Global_type) < 0) {
9811 return -1;
9812 }
9813 if (PyModule_AddObjectRef(m, "Nonlocal", state->Nonlocal_type) < 0) {
9814 return -1;
9815 }
9816 if (PyModule_AddObjectRef(m, "Expr", state->Expr_type) < 0) {
9817 return -1;
9818 }
9819 if (PyModule_AddObjectRef(m, "Pass", state->Pass_type) < 0) {
9820 return -1;
9821 }
9822 if (PyModule_AddObjectRef(m, "Break", state->Break_type) < 0) {
9823 return -1;
9824 }
9825 if (PyModule_AddObjectRef(m, "Continue", state->Continue_type) < 0) {
9826 return -1;
9827 }
9828 if (PyModule_AddObjectRef(m, "expr", state->expr_type) < 0) {
9829 return -1;
9830 }
9831 if (PyModule_AddObjectRef(m, "BoolOp", state->BoolOp_type) < 0) {
9832 return -1;
9833 }
9834 if (PyModule_AddObjectRef(m, "NamedExpr", state->NamedExpr_type) < 0) {
9835 return -1;
9836 }
9837 if (PyModule_AddObjectRef(m, "BinOp", state->BinOp_type) < 0) {
9838 return -1;
9839 }
9840 if (PyModule_AddObjectRef(m, "UnaryOp", state->UnaryOp_type) < 0) {
9841 return -1;
9842 }
9843 if (PyModule_AddObjectRef(m, "Lambda", state->Lambda_type) < 0) {
9844 return -1;
9845 }
9846 if (PyModule_AddObjectRef(m, "IfExp", state->IfExp_type) < 0) {
9847 return -1;
9848 }
9849 if (PyModule_AddObjectRef(m, "Dict", state->Dict_type) < 0) {
9850 return -1;
9851 }
9852 if (PyModule_AddObjectRef(m, "Set", state->Set_type) < 0) {
9853 return -1;
9854 }
9855 if (PyModule_AddObjectRef(m, "ListComp", state->ListComp_type) < 0) {
9856 return -1;
9857 }
9858 if (PyModule_AddObjectRef(m, "SetComp", state->SetComp_type) < 0) {
9859 return -1;
9860 }
9861 if (PyModule_AddObjectRef(m, "DictComp", state->DictComp_type) < 0) {
9862 return -1;
9863 }
9864 if (PyModule_AddObjectRef(m, "GeneratorExp", state->GeneratorExp_type) < 0)
9865 {
9866 return -1;
9867 }
9868 if (PyModule_AddObjectRef(m, "Await", state->Await_type) < 0) {
9869 return -1;
9870 }
9871 if (PyModule_AddObjectRef(m, "Yield", state->Yield_type) < 0) {
9872 return -1;
9873 }
9874 if (PyModule_AddObjectRef(m, "YieldFrom", state->YieldFrom_type) < 0) {
9875 return -1;
9876 }
9877 if (PyModule_AddObjectRef(m, "Compare", state->Compare_type) < 0) {
9878 return -1;
9879 }
9880 if (PyModule_AddObjectRef(m, "Call", state->Call_type) < 0) {
9881 return -1;
9882 }
9883 if (PyModule_AddObjectRef(m, "FormattedValue", state->FormattedValue_type)
Brandt Bucherd2f96672020-02-06 06:45:46 -08009884 < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009885 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -08009886 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009887 if (PyModule_AddObjectRef(m, "JoinedStr", state->JoinedStr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009888 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009889 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009890 if (PyModule_AddObjectRef(m, "Constant", state->Constant_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009891 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009892 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009893 if (PyModule_AddObjectRef(m, "Attribute", state->Attribute_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009894 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009895 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009896 if (PyModule_AddObjectRef(m, "Subscript", state->Subscript_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009897 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009898 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009899 if (PyModule_AddObjectRef(m, "Starred", state->Starred_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009900 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009901 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009902 if (PyModule_AddObjectRef(m, "Name", state->Name_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009903 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009904 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009905 if (PyModule_AddObjectRef(m, "List", state->List_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009906 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009907 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009908 if (PyModule_AddObjectRef(m, "Tuple", state->Tuple_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009909 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009910 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009911 if (PyModule_AddObjectRef(m, "Slice", state->Slice_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009912 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009913 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009914 if (PyModule_AddObjectRef(m, "expr_context", state->expr_context_type) < 0)
9915 {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009916 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009917 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009918 if (PyModule_AddObjectRef(m, "Load", state->Load_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009919 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009920 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009921 if (PyModule_AddObjectRef(m, "Store", state->Store_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009922 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009923 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009924 if (PyModule_AddObjectRef(m, "Del", state->Del_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009925 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009926 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009927 if (PyModule_AddObjectRef(m, "boolop", state->boolop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009928 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009929 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009930 if (PyModule_AddObjectRef(m, "And", state->And_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009931 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009932 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009933 if (PyModule_AddObjectRef(m, "Or", state->Or_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009934 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009935 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009936 if (PyModule_AddObjectRef(m, "operator", state->operator_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009937 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009938 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009939 if (PyModule_AddObjectRef(m, "Add", state->Add_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009940 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009941 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009942 if (PyModule_AddObjectRef(m, "Sub", state->Sub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009943 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009944 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009945 if (PyModule_AddObjectRef(m, "Mult", state->Mult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009946 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009947 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009948 if (PyModule_AddObjectRef(m, "MatMult", state->MatMult_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009949 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009950 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009951 if (PyModule_AddObjectRef(m, "Div", state->Div_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009952 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009953 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009954 if (PyModule_AddObjectRef(m, "Mod", state->Mod_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009955 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009956 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009957 if (PyModule_AddObjectRef(m, "Pow", state->Pow_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009958 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009959 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009960 if (PyModule_AddObjectRef(m, "LShift", state->LShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009961 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009962 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009963 if (PyModule_AddObjectRef(m, "RShift", state->RShift_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009964 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009965 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009966 if (PyModule_AddObjectRef(m, "BitOr", state->BitOr_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009967 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009968 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009969 if (PyModule_AddObjectRef(m, "BitXor", state->BitXor_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009970 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009971 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009972 if (PyModule_AddObjectRef(m, "BitAnd", state->BitAnd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009973 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009974 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009975 if (PyModule_AddObjectRef(m, "FloorDiv", state->FloorDiv_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009976 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009977 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009978 if (PyModule_AddObjectRef(m, "unaryop", state->unaryop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009979 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009980 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009981 if (PyModule_AddObjectRef(m, "Invert", state->Invert_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009982 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009983 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009984 if (PyModule_AddObjectRef(m, "Not", state->Not_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009985 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009986 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009987 if (PyModule_AddObjectRef(m, "UAdd", state->UAdd_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009988 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009989 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009990 if (PyModule_AddObjectRef(m, "USub", state->USub_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009991 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009992 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009993 if (PyModule_AddObjectRef(m, "cmpop", state->cmpop_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009994 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009995 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009996 if (PyModule_AddObjectRef(m, "Eq", state->Eq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +02009997 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +02009998 }
Victor Stinner18ce7f12020-11-04 16:37:07 +01009999 if (PyModule_AddObjectRef(m, "NotEq", state->NotEq_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010000 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010001 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010002 if (PyModule_AddObjectRef(m, "Lt", state->Lt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010003 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010004 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010005 if (PyModule_AddObjectRef(m, "LtE", state->LtE_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010006 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010007 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010008 if (PyModule_AddObjectRef(m, "Gt", state->Gt_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010009 return -1;
Victor Stinner74419f02020-07-03 11:35:37 +020010010 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010011 if (PyModule_AddObjectRef(m, "GtE", state->GtE_type) < 0) {
10012 return -1;
10013 }
10014 if (PyModule_AddObjectRef(m, "Is", state->Is_type) < 0) {
10015 return -1;
10016 }
10017 if (PyModule_AddObjectRef(m, "IsNot", state->IsNot_type) < 0) {
10018 return -1;
10019 }
10020 if (PyModule_AddObjectRef(m, "In", state->In_type) < 0) {
10021 return -1;
10022 }
10023 if (PyModule_AddObjectRef(m, "NotIn", state->NotIn_type) < 0) {
10024 return -1;
10025 }
10026 if (PyModule_AddObjectRef(m, "comprehension", state->comprehension_type) <
Brandt Bucherd2f96672020-02-06 06:45:46 -080010027 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010028 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010029 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010030 if (PyModule_AddObjectRef(m, "excepthandler", state->excepthandler_type) <
10031 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010032 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010033 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010034 if (PyModule_AddObjectRef(m, "ExceptHandler", state->ExceptHandler_type) <
10035 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010036 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010037 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010038 if (PyModule_AddObjectRef(m, "arguments", state->arguments_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010039 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010040 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010041 if (PyModule_AddObjectRef(m, "arg", state->arg_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010042 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010043 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010044 if (PyModule_AddObjectRef(m, "keyword", state->keyword_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010045 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010046 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010047 if (PyModule_AddObjectRef(m, "alias", state->alias_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010048 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010049 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010050 if (PyModule_AddObjectRef(m, "withitem", state->withitem_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010051 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010052 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010053 if (PyModule_AddObjectRef(m, "type_ignore", state->type_ignore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010054 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010055 }
Victor Stinner18ce7f12020-11-04 16:37:07 +010010056 if (PyModule_AddObjectRef(m, "TypeIgnore", state->TypeIgnore_type) < 0) {
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010057 return -1;
Brandt Bucherd2f96672020-02-06 06:45:46 -080010058 }
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010059 return 0;
10060}
Victor Stinner91e1bc12020-07-03 14:15:53 +020010061
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010062static PyModuleDef_Slot astmodule_slots[] = {
10063 {Py_mod_exec, astmodule_exec},
10064 {0, NULL}
10065};
10066
10067static struct PyModuleDef _astmodule = {
10068 PyModuleDef_HEAD_INIT,
10069 .m_name = "_ast",
Victor Stinner5cf47822020-11-02 22:03:28 +010010070 // The _ast module uses a per-interpreter state (PyInterpreterState.ast)
Victor Stinnere5fbe0c2020-09-15 18:03:34 +020010071 .m_size = 0,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010072 .m_slots = astmodule_slots,
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010073};
10074
10075PyMODINIT_FUNC
10076PyInit__ast(void)
10077{
10078 return PyModuleDef_Init(&_astmodule);
Martin v. Löwis577b5b92006-02-27 15:23:19 +000010079}
10080
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010081
Martin v. Löwisbd260da2006-02-26 19:42:26 +000010082PyObject* PyAST_mod2obj(mod_ty t)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010083{
Victor Stinner5cf47822020-11-02 22:03:28 +010010084 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010085 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010086 return NULL;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010087 }
Victor Stinner74419f02020-07-03 11:35:37 +020010088 return ast2obj_mod(state, t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010089}
Martin v. Löwis5b222132007-06-10 09:51:05 +000010090
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010091/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
10092mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010093{
Serhiy Storchaka43c97312019-09-10 13:02:30 +030010094 const char * const req_name[] = {"Module", "Expression", "Interactive"};
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010095 int isinstance;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010096
Steve Dowerb82e17e2019-05-23 08:45:22 -070010097 if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
10098 return NULL;
10099 }
10100
Victor Stinner5cf47822020-11-02 22:03:28 +010010101 struct ast_state *state = get_ast_state();
10102 if (state == NULL) {
10103 return NULL;
10104 }
10105
Victor Stinner74419f02020-07-03 11:35:37 +020010106 PyObject *req_type[3];
10107 req_type[0] = state->Module_type;
10108 req_type[1] = state->Expression_type;
10109 req_type[2] = state->Interactive_type;
Benjamin Peterson42ec0312014-02-10 22:41:40 -050010110
Guido van Rossum3a32e3b2019-02-01 11:37:34 -080010111 assert(0 <= mode && mode <= 2);
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010112
Benjamin Peterson0496c9e2009-12-13 01:24:58 +000010113 isinstance = PyObject_IsInstance(ast, req_type[mode]);
10114 if (isinstance == -1)
10115 return NULL;
10116 if (!isinstance) {
Neal Norwitzdb4115f2008-03-31 04:20:05 +000010117 PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
Dino Viehlandac46eb42019-09-11 10:16:34 -070010118 req_name[mode], _PyType_Name(Py_TYPE(ast)));
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010119 return NULL;
10120 }
Dong-hee Naa05fcd32019-10-10 16:41:26 +090010121
10122 mod_ty res = NULL;
Victor Stinner74419f02020-07-03 11:35:37 +020010123 if (obj2ast_mod(state, ast, &res, arena) != 0)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010124 return NULL;
10125 else
10126 return res;
10127}
10128
10129int PyAST_Check(PyObject* obj)
10130{
Victor Stinner5cf47822020-11-02 22:03:28 +010010131 struct ast_state *state = get_ast_state();
Victor Stinnerb1cc6ba2020-07-03 20:01:46 +020010132 if (state == NULL) {
Victor Stinnerbdf630c2013-07-17 00:17:15 +020010133 return -1;
Victor Stinner91e1bc12020-07-03 14:15:53 +020010134 }
Victor Stinner74419f02020-07-03 11:35:37 +020010135 return PyObject_IsInstance(obj, state->AST_type);
Martin v. Löwis618dc5e2008-03-30 20:03:44 +000010136}
10137
Martin v. Löwis5b222132007-06-10 09:51:05 +000010138